/ / C ++ súkromný ukazovateľ „unikajúci“? - c ++, úniky pamäte, ukazovatele

C ++ súkromný ukazovateľ "uniká"? - c ++, úniky pamäte, ukazovatele

Vytvorím triedu, ktorá bude obsahovať dlhý zoznam parametrov, ktoré budú odovzdané funkcii. Použite tento kratší príklad:

class ParamList{

public:
ParamList(string& a_string);
string& getString(); //returns my_string
private:
string& my_string;
}

Moja otázka znie takto: my_string je súkromný, ale ja som "m vracať odkaz na to. Isn" t, že volal niečo ako súkromné ​​ukazovateľ úniku v C + +? Nie je to dobrá programovacia prax? Chcem volajúci getString byť schopní získať odkaz a tiež upraviť.

Prosím daj mi vedieť.

Vďaka, JBU

edit1: volajúci použijú getString () a upravia reťazec, ktorý bol vrátený.

odpovede:

3 pre odpoveď č. 1

Obnovenie súkromného odkazu je v poriadku, pokiaľ:

A. To je a const a ste zdokumentovali, keď tento odkaz môže byť zrušený alebo
B. Tento odkaz sa má zmeniť (t. J. std::vector<T>::operator[])

Aj keď existujú užitočné prípady pre vrátenie non-const odkaz, mali by ste sa mu vyhnúť. Toto je zahrnuté v Scott Meyers "Efektívne C ++ (3. vydanie, položka 28): Vyhnite sa vráteniu „kľučiek“ na objekt interné, ak by ste sa chceli pozrieť.


2 pre odpoveď č. 2

Najprv sa musíte rozhodnúť, či bude ParamList vlastniť reťazec alebo len "vedieť o ňom". Spôsob, akým ste to napísali, s string& my_stringZnamená to, že má len úchyt na reťazec niekoho iného. V tomto prípade to nie je (pre väčšinu) problém pre niektorých upraviť reťazec, pretože ParamList ho na prvom mieste nevlastní!

Ak chcete, aby ParamList mal úplnú hlavnú kópiu parametrov (závisí od problému, ktorý sa pokúšate vyriešiť), urobte niečo takéto:

class ParamList{

public:
ParamList(const string& a_string); // do a strcpy in here.

const string& getString(); //returns my_string
void setString(const string& new_string); //do a strcpy here too.
private:
string my_string;
}

Všimnite si, že je pravdepodobne lepšie použiť sadu a získať funkcie, skôr ako vracať non-const referencie, takže ParamList môže mať o niečo väčšiu kontrolu nad tým, ako sú jeho členovia modifikovaní.