これは不可能かもしれませんが、一時的なものを元の表現よりも永続的に保つことが可能かどうかは疑問でした。私はポイントの親オブジェクトへのオブジェクトのチェーンを持っており、子オブジェクトを作成するメンバ関数、簡略化した例は、ここに一時的に一時的な存続期間が延長されないようにしますか?
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"));
です。
一時的なものが元の式を過ぎても存続しない限り、これはうまく動作しますが、最終的な一時的なものの1つをconst参照にバインドすると、その親は生き残らないので、segfaultを取得します。私はperson
のコピーコンストラクタと代入演算子を隠すことができますが、この種のエラーが発生するのを防ぐことができる方法はありますか?可能であれば動的割り当てを避けたいと思います。
@Konrad:Ironic; - ] – ildjarn
このコードは同じように「うまくいかない」 'const int&i = std :: vector(1)[0];'を書くことは、 "うまくいかない"ということです。 'vector'はあなたがそれを書くことを止めず、する必要もありません。ここでの重要な点は、ママを破壊すると赤ちゃんが使えなくなるため、赤ちゃんはママの一部だということです。それがデザインに間違っているのですが、直観に反します。適切ではない孤児のようなものが存在しないようにすることでそれにパッチを当てようとしていますが、孤児が行動をより良く定義するべきかどうか、あるいは明らかに悪いものを作成するべきかを考慮する必要があります。 –
Steveとの約束:これはちょうど悪いデザインの表示です。裸のポインタの外観は、何かが離れていることを明らかにしていたはずです。 –