這可能是不可能的,但我想知道是否有可能通過它的原始表達來保持暫時的永久。我有一個指向父對象對象鏈,這將創建一個子對象的成員函數,一個簡單的例子是在這裏防止暫時延長其壽命?
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;
}
我想用person
是將其傳遞給函數的方式,和這樣的事情:
void use(const person & p) {
p.talk();
}
use(person("Anna").baby("Lisa"));
很好。
只要沒有一個臨時存活通過原始表達式,但是如果我將其中一個臨時臨時對象綁定到一個常量引用,它的父項就不能存活,並且我得到一個段錯誤。我可以隱藏person
的拷貝構造函數和賦值操作符,但有什麼辦法可以防止這種錯誤發生?如果可能,我想避免動態分配。
@Konrad:Ironic; - ] – ildjarn
請注意,這段代碼是「不好」的相同方式寫'const int&i = std :: vector(1)[0];'是「不好」。 'vector'不會阻止你寫這個,也不需要。這裏的關鍵是,因爲摧毀媽媽使寶寶無法使用,寶寶是媽媽的一部分。這就是設計的問題,這是違反直覺的。你試圖通過阻止孤兒這樣的事情來補救,這可能是合適的,但你也應該考慮孤兒是否應該有更好的定義行爲,或者應該更明顯是一個壞的事情來創建。 –
同意史蒂夫:這只是糟糕的設計展示。裸指針的外觀應該已經給出了某種東西沒有。 –