Bu imkansız olabilir, ama orijinal ifadesini geçmişten beri geçici tutmak mümkün olup olmadığını merak ediyordum. Ben ana nesneleri işaret nesnelerin zinciri var ve bir alt nesne yaratacak üye işlevi, basitleştirilmiş bir örnek buradaGeçici olarak ömrünü uzatmaktan kaçının mı?
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;
}
Ben person
onu işleve geçmektir kullanmak istediğiniz yoludur ve bunun gibi bir şey:
void use(const person & p) {
p.talk();
}
use(person("Anna").baby("Lisa"));
İyi.
Bu, geçici ifadelerin hiçbirinin özgün ifadeyi geçmediği sürece işe yaramaz, ancak son geçici noktalardan birini bir const referansına bağlarsam, ebeveynleri hayatta kalmaz ve bir segfault alır. person
'un kopya yapıcısını ve atama işlecini gizleyebilirim, ancak bu tür bir hatanın olmasını engelleyebileceğim herhangi bir yol var mı? Mümkünse dinamik ayırmayı önlemek isterim.
@Konrad: Ironic; -] – ildjarn
Bu kodun aynı şekilde "iyi değil" olduğunu unutmayın. const int & i = std :: vector yazıyor (1) 'vektör' bunu yazmayı bırakmaz ve buna gerek yoktur. Buradaki anahtar, anneyi yok etmenin bebeği kullanılamaz hale getirmesi, bebeğin annenin bir parçası olması. Tasarımda yanlış olan bu, karşı sezgiseldir. Yetim gibi bir şeylerin varlığını önleyerek bunu düzeltmeye çalışıyorsunuz, bu da uygun olabilir ama aynı zamanda yetimlerin daha iyi tanımlanmış bir davranışa sahip olup olmadığını veya daha açık bir şekilde yaratılması gereken kötü bir şey olup olmadığını da düşünmelisiniz. –
Steve ile anlaştı: Bu sadece kötü tasarım gösteriyor.Çıplak bir işaretçinin ortaya çıkması, bir şeyin kapalı olduğunu vermelidir. –