[C++] Metody zaprzyjaźnione

0

YO !! [browar]
Tak sie zastanawiam jak można rozwiązać taki problem , mam 2 klasy :
[code]class TEST
{
public:
int fun1();
};

class TEST2
{
public:
int fun2();
friend int TEST::fun1();
};[/code]
W tym momencie metoda fun1() klasy : TEST jest metodą zaprzyjaźnoną klasy TEST2 , co w praktyce oznacza , że będzie mogła korzystać z prywatnych pól i metod klasy TEST2 . Wszystko oki . Ale załużmy że ja chcę żeby metoda fun2() klasy TEST2 była metodą zaprzyjaźnoną klasy TEST . Nie moge napisać w klasie TEST :
friend int TEST2::fun2() bo kompilator nie wie jeszcze nic o tej metodzie ani klasie i wyrzuci błąd . gdybym chciał zamiast metod zapryzjaźnić całe klasy w ten sposób , to ne byłoby problemu . Wtedy umieściłbym 2 deklaracje:
class TEST;
class TEST2;
na samym początku kodu , przed definicjami tych klas i wszystko byłoby ok . Ale z metodami jest troche gorzej , nie moge napisać deklaracji metody , przed definicją klasy , np :
class TEST; //deklaracja klasy
int TEST::fun1(); //deklaracja metody tej klasy
a tu definicja klasy ...
bo wyskakuje błąd , kompilator po prostu nie wie , że ta klasa będzie miała taką metode ...
Jak to rozwiązać ????

0

Heh... to ciekawe, a moze by tak zrobic:

class KLASA
{
public:
int fun2();
};

class TEST
{
public:
int fun1();
friend int KLASA::fun2();

};

class TEST2: KLASA
{
public:
friend int TEST::fun1();
};

Nie mam pojecia czy tak mozna i czy bedzie dzialac... i czy to w ogole ma sens... jest pozno i ledwo siedze wiec tez ledwo mysle... :)

0

tak można :) , ale nie o to mi chodziło :)
Chodziło mi o to , że sytuacja sie komplikuje gdy w twoim przykładzie np chcemy dodatkowo zrobić z metody :
int TEST::fun1();
metodę zaprzyjaxnioną klasy KLASA
????????????????

P.S. co oznazca taki zapis :
class TEST2: KLASA
???
troche przypomina to dziedziczenie , ale brakuje słowa public ...
[glowa]

0

P.S. co oznazca taki zapis :
class TEST2: KLASA
???
troche przypomina to dziedziczenie , ale brakuje słowa public ...

Hehe... no to mialo byc dziedziczenie ale chyba o czyms zapomnialem. Ale o dziwo taki zapis jest poprawny tylko nie wiem czym skutkuje.
W przykladzie, ktory podalem chodzilo mniej wiecej o to, ze:
klasa TEST2 jest pochodna klasy KLASA wiec dziedziczy po niej funkcje fun2(), ktora to z kolei funkcja jest przyjacielem klasy TEST. Wiec... qrcze gubie sie...
To moze tak:
class TEST
{
public:
int fun1();
friend int TEST2::fun2();

};

class TEST2
{
public:
int fun2();
friend int TEST::fun1();
};

Wiec taki zapis nie bedzie dzialc... bo kasa TEST "nie zna jeszcze" TEST2. Qrcze przymotalem sie sam... A w moim zapisie:
Skoro TEST2 jest pchodna klasy KLASA to posiada funkcje fun2(), ktora z kolei jest zaprzyjazniona z TEST, wiec mniej wiecej jest to rownowazne powyzszemu zapisowi (chyba...) :)
Ehhh mozg mi sie zlasowal juz... pokrecone to wszystko, zapewne tez cos pokrecilem :p [stuk]

0

Oczywiście masz racje , za pomocą dziedziczenia można to rozwiązać , ale zawsze jest jakieś ale ...
W twoim pomyśle używamy 3 klas a nie dwóch , a do tego używamy dziedziczenia za którym nie przepadam ;) .
Mi chodziło tylko o taki extramalny przypadek jak mamy 2 klasy ....
Ale tak sie chyba nie da ...
[browar]

0

Nie, nie mozna :)
po to wlasnie jest dziedziczenie, zeby takich bajek nie tworzyc :P
Nie dosc, ze to jakos nielogicznie wyglada to jeszcze sie nie kompiluje ;)

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