Może to być niemożliwe, ale zastanawiałem się, czy możliwe było zachowanie tymczasowego odlegle od jego pierwotnego wyrażenia. Mam sieć obiektów, które wskazują na obiektach nadrzędnych, a funkcja członek, który stworzy obiekt podrzędny, uproszczonym przykładem jest tutajZapobieganie czasowemu przedłueniu jego okresu trwałości?
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;
}
Sposób chcę użyć person
jest przekazanie go do funkcji, i coś takiego:
void use(const person & p) {
p.talk();
}
use(person("Anna").baby("Lisa"));
Jest w porządku.
To zadziała dobrze, o ile żaden z tymczasników nie przeżyje poza pierwotnym wyrażeniem, ale jeśli zwiążę jeden z ostatnich tymczasowych do odniesienia do const, jego rodzice nie przetrwają, a ja dostaję segfault. Mogę ukryć konstruktora kopii i operatora przypisania, ale czy jest jakiś sposób, aby zapobiec temu rodzajowi błędu? Jeśli to możliwe, chciałbym uniknąć alokacji dynamicznej.
@Konrad: Ironiczny; -] – ildjarn
Zauważ, że ten kod jest "nie w porządku" w taki sam sposób że pisanie 'const int & i = std :: vector (1) [0];' jest "nie w porządku". 'vector' nie przestajesz pisać tego i nie musisz tego robić. Kluczem jest to, że ponieważ niszczenie mamusi powoduje, że dziecko nie nadaje się do użytku, dziecko jest częścią mamusi. To, co jest nie tak z projektem, jest sprzeczne z intuicją. Próbujesz to załatać, uniemożliwiając istnienie czegoś takiego jak sierota, co może być odpowiednie, ale powinieneś również rozważyć, czy sieroty powinny mieć lepiej zdefiniowane zachowanie, czy też powinny być w oczywisty sposób złe. –
Uzgodniono ze Steve'em: to tylko zły projekt.Pojawienie się gołego wskaźnika powinno spowodować, że coś jest nie tak. –