私は参照を理解する時間の悪魔を持っています。次のコードを検討してください。
class Animal
{
public:
virtual void makeSound() {cout << "rawr" << endl;}
};
class Dog : public Animal
{
public:
virtual void makeSound() {cout << "bark" << endl;}
};
Animal* pFunc()
{
return new Dog();
}
Animal& rFunc()
{
return *(new Dog());
}
Animal vFunc()
{
return Dog();
}
int main()
{
Animal* p = pFunc();
p->makeSound();
Animal& r1 = rFunc();
r1.makeSound();
Animal r2 = rFunc();
r2.makeSound();
Animal v = vFunc();
v.makeSound();
}
そして結果は次のとおりです:「樹皮樹皮rawrrawr」。
Javaの考え方では(これは明らかに私のC ++の概念を破壊しました)、結果は「樹皮樹皮樹皮樹皮」になります。以前の質問から、この違いはスライスによるものであることがわかり、スライスとは何かをよく理解できました。
しかし、実際には犬である動物の値を返す関数が必要だとしましょう。
- 私が得ることができる最も近いものが参照であることを正しく理解していますか?
- さらに、rFuncインターフェースを使用して、返される参照がAnimal&に割り当てられていることを確認する必要がありますか?(または、スライスを介して多型を破棄する動物への参照を意図的に割り当てます。)
- 上記のrFuncで行った愚かなことを行わずに、いったいどうやって新しく生成されたオブジェクトへの参照を返すことになっているのでしょうか。(少なくとも、これはばかげていると聞きました。)
更新:これまでのところ、rFuncは違法であることに誰もが同意しているように見えるため、別の関連する質問が発生します。
ポインターを返す場合、そのポインターが削除するものではないことをプログラマーにどのように伝えるのですか?または、ポインターがいつでも(同じスレッドから異なる関数から)削除されることを通知して、呼び出し元の関数がポインターを格納しないようにするにはどうすればよいですか。コメントを通じてこれを伝える唯一の方法はありますか?それはずさんなようです。
注:これはすべて、私が取り組んでいたテンプレート化されたshared_pimplの概念のアイデアにつながります。うまくいけば、私は数日でそれについて何かを投稿するのに十分なことを学ぶでしょう。