パラメーターとして基本クラスを必要とする関数の引数としてunique_ptrを使用する方法

ドラコ

マネージド ポインター、特に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
}
ケレックSB

所有権をmakeAnimalNoise関数に移したくありませんスマート ポインターは、責任の所有者のみが使用する必要があります。あなたは絶対にすべきではない置き換えるすべてのスマートポインタを使用してコードを。

あなたの関数はただ参照をとるべきです:

void makeAnimalNoise(Animal& an) {
  an.doAnimalStuff();
}

コール サイトで:

makeAnimalNoise(*Dog);
makeAnimalNoise(*Cat);

繰り返しになりますが、スマート ポインターは、ポインターの所有権が API の対象である場合にのみ、API に表示されるべきです。ポイントのみが必要な場合は、参照またはプレーン ポインター パラメーターを使用します。

別の言い方をすると、スマート ポインターは責任を管理するためのツールであり、値を渡したり、参照セマンティクスを実装したりするためのものではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ラムダと関数をunique_ptrのカスタム削除機能として使用する方法

分類Dev

型パラメーターを関数の引数として送信する方法

分類Dev

クラス関数を他のクラスメソッドのパラメータとして使用する方法

分類Dev

2つの引数を必要とするac関数をラップするunique_ptrクラスメンバーのカスタムデリータをどのように作成しますか?

分類Dev

関数(c ++)の入力パラメーターとしてパラメーターパックとtypenameを使用するクラスを取得する方法

分類Dev

C ++の関数パラメーターでunique_ptrとshared_ptrを使用する

分類Dev

関数をパラメータとして使用する関数

分類Dev

関数パラメーターとして抽象クラスを使用する

分類Dev

std :: vector <unique_ptr <T >>をデフォルトパラメータとして使用する方法

分類Dev

クラスのプライベートメンバーとしてunique_ptrのmoveコンストラクターと演算子を実装する方法

分類Dev

関数のパラメーターとしてAngularJS値を使用する方法は?

分類Dev

パラメータを必要とする無名関数を、onclickに割り当てられる引数として別の関数に渡します

分類Dev

Rで複数のパラメーターを必要とする関数を使用して要約する

分類Dev

qsubスクリプト内の引数パラメーターとして変数を使用する

分類Dev

NSArrayを関数パラメーターとして使用する

分類Dev

CGFloatをパラメーターとして使用する関数

分類Dev

関数のパラメーターとして使用するクロージャーを宣言する方法

分類Dev

テンプレートパラメータとして可変個引数パラメータを使用してメンバー関数を作成する方法

分類Dev

テンプレート関数のパラメーターとしてboost :: optional引数を使用する

分類Dev

rに複数のパラメーターを持つ関数の引数としてベクトルを使用する方法

分類Dev

関数をパラメータとして使用する-問題

分類Dev

Python-関数のパラメーターとしてクラスのリストを使用する

分類Dev

型パラメーターとして使用するときにクラスコンストラクターに引数を渡す方法はありますか?

分類Dev

テンプレートパラメータ引数として任意の関数を使用する

分類Dev

C ++関数のパラメーターとしてラムダを使用する

分類Dev

カスタム関数のパラメーターとして関数を追加する方法-迅速ですか?

分類Dev

メンバー関数のデフォルト引数としてクラスメンバーを使用する

分類Dev

関数と引数のパラメーターを必要とする関数でstd :: asyncを使用する

分類Dev

引数としてunique_ptrを使用してクラスのメソッドを呼び出すことは合法ですか?

Related 関連記事

  1. 1

    ラムダと関数をunique_ptrのカスタム削除機能として使用する方法

  2. 2

    型パラメーターを関数の引数として送信する方法

  3. 3

    クラス関数を他のクラスメソッドのパラメータとして使用する方法

  4. 4

    2つの引数を必要とするac関数をラップするunique_ptrクラスメンバーのカスタムデリータをどのように作成しますか?

  5. 5

    関数(c ++)の入力パラメーターとしてパラメーターパックとtypenameを使用するクラスを取得する方法

  6. 6

    C ++の関数パラメーターでunique_ptrとshared_ptrを使用する

  7. 7

    関数をパラメータとして使用する関数

  8. 8

    関数パラメーターとして抽象クラスを使用する

  9. 9

    std :: vector <unique_ptr <T >>をデフォルトパラメータとして使用する方法

  10. 10

    クラスのプライベートメンバーとしてunique_ptrのmoveコンストラクターと演算子を実装する方法

  11. 11

    関数のパラメーターとしてAngularJS値を使用する方法は?

  12. 12

    パラメータを必要とする無名関数を、onclickに割り当てられる引数として別の関数に渡します

  13. 13

    Rで複数のパラメーターを必要とする関数を使用して要約する

  14. 14

    qsubスクリプト内の引数パラメーターとして変数を使用する

  15. 15

    NSArrayを関数パラメーターとして使用する

  16. 16

    CGFloatをパラメーターとして使用する関数

  17. 17

    関数のパラメーターとして使用するクロージャーを宣言する方法

  18. 18

    テンプレートパラメータとして可変個引数パラメータを使用してメンバー関数を作成する方法

  19. 19

    テンプレート関数のパラメーターとしてboost :: optional引数を使用する

  20. 20

    rに複数のパラメーターを持つ関数の引数としてベクトルを使用する方法

  21. 21

    関数をパラメータとして使用する-問題

  22. 22

    Python-関数のパラメーターとしてクラスのリストを使用する

  23. 23

    型パラメーターとして使用するときにクラスコンストラクターに引数を渡す方法はありますか?

  24. 24

    テンプレートパラメータ引数として任意の関数を使用する

  25. 25

    C ++関数のパラメーターとしてラムダを使用する

  26. 26

    カスタム関数のパラメーターとして関数を追加する方法-迅速ですか?

  27. 27

    メンバー関数のデフォルト引数としてクラスメンバーを使用する

  28. 28

    関数と引数のパラメーターを必要とする関数でstd :: asyncを使用する

  29. 29

    引数としてunique_ptrを使用してクラスのメソッドを呼び出すことは合法ですか?

ホットタグ

アーカイブ