Hodně záludná (ale zásadní) otázka ohledně syntaxe C++:
Jde pomocí friend nebo jakkoli jinak zařídit aby konstruktor nějaké třídy, jež má jako parametr nějakou instanci téže třídy (typicky kopírovací konstruktor), měl přístup k private členům parametru??
// Takto
class name{
private:
Typ data;
public:
name(name&); // Copy constructor.
friend name.name(name&); // Constructor jedné instance chce být friend jiné v parametru.
// Kompilátor vypíše expected unqualified-id before '.' token
Fórum › C / C++
Jak nastavit kopírovací konstruktor jako friend?
tady se prece nepouziva operator . ale ::
pokud bys to mel pro jednu tridu tak pristup k private memberum mas automaticky, tedy nemusis to deklarovat jako frienda.
jinak by to vypadalo asi takhle:
class a;
class b{
private:
int cis;
public:
b(a& oth);
};
class a{
private:
int cis;
public:
friend b::b(a& oth);
};
b::b(a& oth){
cis = oth.cis;
}
pokud bys to mel pro jednu tridu tak pristup k private memberum mas automaticky, tedy nemusis to deklarovat jako frienda.
Oops, to jsem nevěděl (přestože je to poměrně základní věc), díky i za příklad, už to chápu.
Jen ještě jedna věc mi není jasná, jak bys zařídil, aby ty dvě třídy měly vzájemně zpřátelené konstruktory??
Protože vždycky ta třída, jejíž metodu chceš dát friend musí být celá definovaná a to by s dvěma třídami vzájemně jaksi technicky nešlo. Napadlo mě to udělat přes společného předka, jímž by byla čirá třída s virtuálním kopírovacím konstruktorem. Funkčností takové konstrukce si však nejsem příliš jist...
no nejjednoduseji to muzes udelat tak ze vytvoris dve globalni funkce ktere tem tridam das jako frienda a budes je volat v konstruktoru. pres toho predka bych to asi nedelal...
nebo to muzes udelat kompozici: udelas jednu tridu, ktere jako clena a zaroven frienda deklarujes druhou tridu. te deklarujes tridu ktera tuto vlastni tez jako frienda. priklad:
class c{
private:
int cis;
public:
class d;
friend class d;
class d{
private:
int cis;
public:
friend class c;
d(c& oth): cis(oth.cis){};
};
void o(d& oth){cis = oth.cis;}
c(d& oth){
cis = oth.cis;
}
};
ale je to trochu psycho)
EDIT by tmi: nevim proc jsem to psal zrovna takhle, neni treba aby jedna trida byla prvkem druhy, staci kdyz budou kamaradi.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Kopírovací konstruktor — založil oxidián
Kopírovací konstruktor (deep-copy), destruktor a operátor přiřazení — založil Pepa512
Ako nastavit arraysize pola cez konstruktor? — založil JoseUP
Makro pro Word: Jak zjistit jestli je vybraný text a jak nastavit sc… — založil oxidián
Jak nastavit klávesnici. — založil Benny1181
Moderátoři diskuze