pytanie o klasy zaprzyjaźnione

0

Witam

Ostatnio na wykładzie było trochę o przyjaźni między klasami...

W ramach utrwalenia wiedzy napisałem od taki kod i mam parę pytań

#include <iostream>
#include <conio>
#include <string>
#include <windows>

using namespace std;

class druga;

class pierwsza
{
        private :

        string imie;
        pierwsza() {};

        public :

        pierwsza(string name);
        pierwsza(string name,druga& d);

        friend void justuj(string napis);
        friend class druga;
};

pierwsza::pierwsza(string name) : imie(name)
{
        justuj(imie);
}

class druga
{
        private :
        const string data_ur;
        druga() {}
        string lacz(string s1,string s2);

        public  :

        druga(string age);
        friend class pierwsza;
};

pierwsza::pierwsza(string name,druga& d) : imie(name)
{
        justuj(d.lacz(imie,d.data_ur));
}

druga::druga(string age) : data_ur(age)
{
}

string druga::lacz(string s1,string s2)
{
        string tmp = s1+" "+s2;
        return tmp;
}

// fun zaprzyjaziona
void justuj(string napis)
{
        int x = 40 - napis.length() / 2;
        gotoxy(x,10);
        cout << napis;
}

int main()
{
        druga  ta("10.10.2000 r.");

        pierwsza ja("Twoje imie",ta);

        getch();
        return 0;
}
  1. Definicje konstruktora klasy "pierwsza" muszę umieścić po klasie "druga" inaczej wywala błąd że pola i metody nie są jeszcze zdefiniowane, Czy taki błąd będzie występował np. jeśli klasy mamy w oddzielnych plikach .h .cpp ? Czy w ogole inaczej trzeba to zaprojektować aby pozbyć się tego błędu.

  2. Czy takie przekazanie przez referencję tymczasowego obiektu to dobre rozwiązanie ? czy da się w inny sposób dobrać do pól i metod klasy drugiej

pierwsza::pierwsza(string name,druga& d) : imie(name)
{
        justuj(d.lacz(imie,d.data_ur));
}

chodzi mi oczywiście wyłącznie o temat klas zaprzyjaźnionych nie alternatywne rozwiązania:)

Pozdrawiam

1
  1. Wystarczy dodać deklarację tych metod analogicznie jak dodałeś deklarację
class druga;

Jeżeli chodzi o klasy w różnych plikach to dodajesz include z plikiem nagłówkowym (.h) klasy do której chcesz się odwoływać.

  1. Masz do wyboru referencję albo wskaźnik, ewentualnie przekazanie przez wartość. Tylko wtedy nic w obiekcie, który przekazujesz nie zmienisz (tzn. zmiany nie będą widoczne po powrocie z funkcji).
0

Jeśli chcesz zmieniać wartości drugiej klasy możesz stworzyć specjalne funkcje w tej klasie które zwracają referencje do danej zmiennej..

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