マネージド ポインター、特にunique_ptrの使用方法を学んでいます。
これらの単純なクラスを実装しましたが、正しい引数を渡していると思うのに、関数 makeAnimalNoise() が機能しません。
makeAnimalNoise() 関数の何が問題になっていますか? この関数の正しい引数は何ですか? それとも定義自体が間違っているのでしょうか?
class Animal{
public:
Animal(){
cout<<"An animal is born"<<endl;
}
virtual ~Animal(){
cout<<"An animal dies"<<endl;
}
virtual void doAnimalStuff()=0;
};
class Dog: public Animal{
public:
Dog(){
cout<<"A dog is born"<<endl;
}
~Dog() {
cout<<"A dog dies"<<endl;
}
void doAnimalStuff() override {
cout<<"I'm a dog"<<endl;
}
};
class Cat: public Animal{
public:
Cat(){
cout<<"A cat is born"<<endl;
}
~Cat() {
cout<<"A cat dies"<<endl;
}
void doAnimalStuff() override {
cout<<"I'm a cat"<<endl;
}
};
void makeAnimalNoise(unique_ptr<Animal>an){
an->doAnimalStuff();
}
int main(){
unique_ptr<Animal>Dog=unique_ptr<Dog>(new Dog());
unique_ptr<Animal>Cat=unique_ptr<Cat>(new Cat());
makeAnimalNoise(Dog); //doesn't work here
makeAnimalNoise(Cat); //doesn't work here
}
所有権をmakeAnimalNoise
関数に移したくありません。スマート ポインターは、責任の所有者のみが使用する必要があります。あなたは絶対にすべきではない置き換えるすべてのスマートポインタを使用してコードを。
あなたの関数はただ参照をとるべきです:
void makeAnimalNoise(Animal& an) {
an.doAnimalStuff();
}
コール サイトで:
makeAnimalNoise(*Dog);
makeAnimalNoise(*Cat);
繰り返しになりますが、スマート ポインターは、ポインターの所有権が API の対象である場合にのみ、API に表示されるべきです。ポイントの値のみが必要な場合は、参照またはプレーン ポインター パラメーターを使用します。
別の言い方をすると、スマート ポインターは責任を管理するためのツールであり、値を渡したり、参照セマンティクスを実装したりするためのものではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加