Questo potrebbe essere impossibile, ma mi chiedevo se fosse possibile mantenere una temporanea da sempre duratura rispetto alla sua espressione originale. Ho una catena di oggetti che puntano a oggetti padre, e una funzione di membro che creerà un oggetto figlio, un esempio semplificato è quiImpedire temporaneamente di estendere la sua durata?
class person{
string name;
person * mommy;
public:
person(const string & nam, person * m = 0) : name(nam), mommy(m) {}
person baby(const string & nam){
return person(nam, this);
}
void talk() const{
if (mommy) mommy->talk();
cout << name << endl;
}
};
int main(){
person("Ann").baby("Susan").baby("Wendy").talk(); // fine
const person & babygirl = person("Julie").baby("Laura"); // not fine
babygirl.talk(); // segfault
return 0;
}
Il modo in cui voglio usare person
è quello di passare a una funzione, e qualcosa del genere:
void use(const person & p) {
p.talk();
}
use(person("Anna").baby("Lisa"));
Va bene.
Questo funzionerà bene fino a quando nessuno dei provvisori sopravviverà oltre l'espressione originale, ma se lego uno dei provvisori finali a un riferimento const, i suoi genitori non sopravvivono e io ottengo un segfault. Posso nascondere il costruttore di copie e l'assegnatore di copie di person
, ma esiste un modo per evitare che si verifichi questo tipo di errore? Vorrei evitare l'allocazione dinamica se possibile.
@Konrad: Ironico; -] – ildjarn
Nota che questo codice è "non buono" allo stesso modo quella scrittura 'const int & i = std :: vector (1) [0];' is "non fine". 'vector' non ti impedisce di scriverlo e non ne ha bisogno. La chiave qui è che, poiché distruggere la mamma rende il bambino inutilizzabile, il bambino fa parte della mamma. Questo è ciò che è sbagliato nel design, è contro-intuitivo. Stai provando ad aggiustare tutto ciò impedendo che ci sia qualcosa di orfano, il che potrebbe essere appropriato, ma dovresti anche considerare se gli orfani dovrebbero semplicemente avere un comportamento meglio definito, o dovrebbe essere ovviamente una cosa cattiva da creare. –
Concordato con Steve: questo è solo un cattivo design che mostra.L'aspetto di un puntatore nudo dovrebbe aver dato via che qualcosa non va. –