deklaracje przyjazni

0

Ponizej przyklad zawarty w ksiazce "Symfonia C++" na deklaracje przyjazni.
Wpisalem to do CodeBlocksa i niestety program mi sie wysypuje podczas konwersji w linijce gdzie jest napisany konstruktor dla klasy punkt.
Gdy konstruktor przeniose do ciala klasy punkt program dziala bezblednie. Czy moze mi ktos wytlumaczyc dlaczego?
Mozna by wysnuc wniosek ze po prosu konstruktor musi byc wewnatrz ciala klasy, ale przeciez konstruktor dla klasy kwadrat tez jest poza cialem klasy.
Gdzie jest problem ? - przegladnalem ten program i nie widze literowki ( jak jest literowka to splone ze wstydu:()

 #include <iostream>
#include <string>

using namespace std;

class punkt;


class kwadrat

{
    int x,y;
    int bok;
    string nazwa;

public:
    kwadrat(int a, int b, int dd, string opis);
    int sedzia (punkt &p);

};



class punkt
{
    int x,y;
    string nazwa;

public:
    punkt(int a, int b, string opis);
    void ruch(int n, int m)
    {
        x+=n;
        y+=m;
    }


    friend int kwadrat::sedzia(punkt &p);




};

 punkt::punkt(int a, int b, char *opis)
{
    x=a;
    y=b;
    nazwa=opis;

}


kwadrat::kwadrat(int a, int b, int dd, string opis)
{
    x=a;
    y=b;
    bok=dd;
    nazwa=opis;

}



int kwadrat::sedzia (punkt &pt)
{
    if((pt.x>=x)&&(pt.x<=(x+bok))
       &&
       (pt.y>=y)&&(pt.y<=(y+bok))
       )

    {
        cout<<pt.nazwa<<"lezy na tle "<<nazwa<<endl;
        return 1;
    }
    else{cout<<"AUT!"<<pt.nazwa<<"jest na zewnatrz "<<nazwa<<endl;
    return 0;
    }

}


int main()
{
   kwadrat bo(10,10,40, "boiska");
   punkt pi(20,20, "pilka ");
   bo.sedzia(pi);
}
1
punkt(int a, int b, string opis);
punkt::punkt(int a, int b, char *opis)

std::string z char * pomyliłeś.

0

Dzieki mlw4:). Na usprawiedliwienie powiem ze blad jest w ksiazce - co nie zmienia faktu ze nie pwowinienem bezmyslnie przepisac programu z ksiazki:)
Mam jeszcze jedno pytanie odnosnie tego programu.
Podzielilem powyzszy progam na pliki z rozszezeniami *.cpp i *.h. Niestety nie moge go skompilowac z racji bledów.Czy moze mi ktos napisac gdzie sa bledy??
Pliki ponizej:

main.cpp:

 #include <iostream>
#include <string>
#include "kwadrat.h"
#include "punkt.h"
using namespace std;


int main()
{
   kwadrat bo(10,10,40, "boiska");
   punkt pi(20,20, "pilka ");
   bo.sedzia(pi);
}

kwadrat.h:

#include <iostream>
#include <cstring>
using namespace std;



class kwadrat

{
    int x,y;
    int bok;
    string nazwa;

public:
    kwadrat(int a, int b, int dd, string opis);
    int sedzia (punkt &p);

}; 

kwadrat.cpp:

 #include <iostream>
#include <cstring>
#include "kwadrat.h"
#include "punkt.h"


using namespace std;

kwadrat::kwadrat(int a, int b, int dd, string opis)
{
    x=a;
    y=b;
    bok=dd;
    nazwa=opis;

}



int kwadrat::sedzia (punkt &pt)
{
    if((pt.x>=x)&&(pt.x<=(x+bok))
       &&
       (pt.y>=y)&&(pt.y<=(y+bok))
       )

    {
        cout<<pt.nazwa<<"lezy na tle "<<nazwa<<endl;
        return 1;
    }
    else{cout<<"AUT!"<<pt.nazwa<<"jest na zewnatrz "<<nazwa<<endl;
    return 0;
    }

}

punkt.h :

 #include <iostream>
#include <cstring>
#include "kwadrat.h"

using namespace std;



class punkt
{
    int x,y;
    string nazwa;

public:
    punkt(int a, int b, string opis);
    void ruch(int n, int m)
    {
        x+=n;
        y+=m;
    }


    friend int kwadrat::sedzia(punkt &p);




};

punkt.cpp :

 #include <iostream>
#include <cstring>
#include "punkt.h"
using namespace std;



 punkt::punkt(int a, int b, string opis)
{
    x=a;
    y=b;
    nazwa=opis;

};
1

w plikach .h (te które includujesz w plikach .c / .cpp) rób:

#pragma once 
// ... twój kod ...

lub:

#ifndef PLIK_H
#define PLIK_H
// ... twój kod ...
#endif

PS. Jeśli w pliku .h możesz nie includować innego pliku .h bo możesz skorzystać z forward declaration to rób to. Includowanie plików .h w plikach .h spowalnia tylko kompilacje w przypadku zmiany tego pliku .h.
Tak więc tutaj:

friend int kwadrat::sedzia(punkt &p);

Bym zamienił na:

friend class kwadrat;

Wtedy wyjdzie, że każda metoda z klasy kwadrat będzie miała dostęp do pól prywatnych klasy punkt.

0

Bardzo mi pomogłeś mwl4. Zastosowałem się do Twojej porady:)
Ale, jeszcze jeden problem:
wyskakuje mi log kompilacji:

-------------- Build: Debug in klasy zaprzyjaznione (compiler: Copy of GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -g -c "D:\C++\klasy zaprzyjaznione\kwadrat.cpp" -o obj\Debug\kwadrat.o
In file included from D:\C++\klasy zaprzyjaznione\kwadrat.h0,
from D:\C++\klasy zaprzyjaznione\kwadrat.cpp
D:\C++\klasy zaprzyjaznione\punkt.h40: error: invalid use of incomplete type 'class kwadrat'
D:\C++\klasy zaprzyjaznione\punkt.h7: error: forward declaration of 'class kwadrat'
D:\C++\klasy zaprzyjaznione\punkt.h: In member function 'int kwadrat::sedzia(punkt&)':
D:\C++\klasy zaprzyjaznione\punkt.h9: error: 'int punkt::x' is private
D:\C++\klasy zaprzyjaznione\kwadrat.cpp12: error: within this context
In file included from D:\C++\klasy zaprzyjaznione\kwadrat.h0,
from D:\C++\klasy zaprzyjaznione\kwadrat.cpp
D:\C++\klasy zaprzyjaznione\punkt.h9: error: 'int punkt::x' is private
D:\C++\klasy zaprzyjaznione\kwadrat.cpp23: error: within this context
In file included from D:\C++\klasy zaprzyjaznione\kwadrat.h0,
from D:\C++\klasy zaprzyjaznione\kwadrat.cpp
D:\C++\klasy zaprzyjaznione\punkt.h11: error: 'int punkt::y' is private
D:\C++\klasy zaprzyjaznione\kwadrat.cpp12: error: within this context
In file included from D:\C++\klasy zaprzyjaznione\kwadrat.h0,
from D:\C++\klasy zaprzyjaznione\kwadrat.cpp
D:\C++\klasy zaprzyjaznione\punkt.h11: error: 'int punkt::y' is private
D:\C++\klasy zaprzyjaznione\kwadrat.cpp23: error: within this context
In file included from D:\C++\klasy zaprzyjaznione\kwadrat.h0,
from D:\C++\klasy zaprzyjaznione\kwadrat.cpp
D:\C++\klasy zaprzyjaznione\punkt.h12: error: 'std::string punkt::nazwa' is private
D:\C++\klasy zaprzyjaznione\kwadrat.cpp18: error: within this context
In file included from D:\C++\klasy zaprzyjaznione\kwadrat.h0,
from D:\C++\klasy zaprzyjaznione\kwadrat.cpp
D:\C++\klasy zaprzyjaznione\punkt.h12: error: 'std::string punkt::nazwa' is private
D:\C++\klasy zaprzyjaznione\kwadrat.cpp27: error: within this context
Process terminated with status 1 (0 minute(s), 0 second(s))
14 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Pomożesz mi jeszcze raz??

Ok udalo mi sie rozwiazac problem:)
Dzieki

0

Hej;
Mam jeszcze pytanie odnosnie deklaracji przyjazni.
Ponizej mam zadeklarowana przyjazn z funkcja. Funkcja jest wywolywana z argumentem z referencja. Nie wiem dlaczego mam blad:

== Build: Debug in mecz (compiler: Copy of GNU GCC Compiler) ===

D:\C++\mecz\boisko.cpp||In member function 'void boisko::poz_pilki(pilka&)':|
D:\C++\mecz\boisko.cpp|335|error: no matching function for call to 'std::basic_string<char>::replace(std::string&)'|
D:\C++\mecz\boisko.cpp|335|note: candidates are:|

Czy przyczyna jest argument z referencja ? jak to ominac?
Ponizej fragment programu:

void boisko::poz_pilki(pilka &pil)
{

   cout<<"  boisko - wsp x :"<<pil.x_ball<<" wsp y :"<<pil.y_ball<<" pilka :"<<pil.obraz_ball<<endl;

   tresc.replace(((szerokosc_ekranu*(pil.x_ball)+pil.y_ball),pil.obraz_ball.length(),pil.obraz_ball));
} 
1

Komunikat jasno mówi: nie ma czegoś takiego jak string::replace(string&)

tresc.replace(((szerokosc_ekranu*(pil.x_ball)+pil.y_ball),pil.obraz_ball.length(),pil.obraz_ball));

masz jedną zbędną parę nawiasów, przez co całość jest traktowane jako

tresc.replace(cos);

gdzie cos jest typu string& (pewnie dlatego, że pil.obraz_ball jest string, więc operator przecinek właśnie to zwraca)

0

twonek - dzieki za odpowiedź, ale dalej nie rozumiem:(
Czyli jest jakis blad w skladni czy zamotalem cos w deklarowaniu zmiennych?
Mam nadzieję, że masz trochę cierpliwosci:)


Dzieki - teraz juz dziala:) Poczatki bywaja trudne:( cale wczorajsze popoludnie sie na to gapilem i tegonie zauważylem...

1 użytkowników online, w tym zalogowanych: 0, gości: 1