3

これは私のコードです

#include <iostream>
#include <vector>
#include <memory>
#include <tr1/memory> 
using namespace std;

class Animal {
  public:
    string name;
    Animal (const std::string& givenName) : name(givenName) {

    }

  };

class Dog: public Animal {
  public:
    Dog (const std::string& givenName) : Animal (givenName) {

    }
    string speak ()
      { return "Woof, woof!"; }
  };

class Cat: public Animal {
  public:
    Cat (const std::string& givenName) : Animal (givenName) {
    }
    string speak ()
      { return "Meow..."; }
  };

int main() {
    vector<Animal> animals;
    Dog * skip = new Dog("Skip");
    animals.push_back( skip );
    animals.push_back( new Cat("Snowball") );

    for( int i = 0; i< animals.size(); ++i ) {
        cout << animals[i]->name << " says: " << animals[i]->speak() << endl;
    }

}

これらは私のエラーです:

index.cpp: In function ‘int main()’:
index.cpp:36: error: no matching function for call to ‘std::vector<Animal, std::allocator<Animal> >::push_back(Dog*&)’
/usr/include/c++/4.2.1/bits/stl_vector.h:600: note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Animal, _Alloc = std::allocator<Animal>]
index.cpp:37: error: no matching function for call to ‘std::vector<Animal, std::allocator<Animal> >::push_back(Cat*)’
/usr/include/c++/4.2.1/bits/stl_vector.h:600: note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Animal, _Alloc = std::allocator<Animal>]
index.cpp:40: error: base operand of ‘->’ has non-pointer type ‘Animal’
index.cpp:40: error: base operand of ‘->’ has non-pointer type ‘Animal’

私がしたいこと:

可能な動物オブジェクトのリストを通過する動的データ構造を使用したいだけです。

私は、C++ 構文でこのポリモーフィズムの概念を学ぼうとしています。

私は Java と PHP には精通していますが、C++ にはあまり詳しくありません。

アップデート:

回答の1つで言及されているように、変更を追加しました。http://pastebin.com/9anijwzQ

しかし、unique_ptr に関するエラーが発生しています。メモリを入れました。だから私は問題が何であるか分かりません。

http://pastebin.com/wP6vEVn6はエラー メッセージです。

4

2 に答える 2

4

2 つの問題があります。

まず、ベクトルにオブジェクトが含まれており、派生型Animalへのポインターで埋めようとしています。とは同じ型ではないため、通常、操作はコンパイルされません。AnimalAnimalAnimal*

次に、Animalメソッドがありませんspeak()Animalの派生型をベクターにプッシュすると、オブジェクト スライスが発生します。Animalたとえば、ベクトルに へのスマートポインタを保持させることで、これを回避できますstd::vector<std::unique_ptr<Animal>>Animalただし、speak()仮想メソッドを指定する必要があります。例えば:

class Animal {   
 public:
  std::string name;
  Animal (const std::string& givenName) : name(givenName) {}
  virtual std::string speak () = 0;
  virtual ~Animal() {}
};

int main() {
  std::vector<std::unique_ptr<Animal>> animals;
  animals.push_back( std::unique_ptr<Animal>(new Dog("Skip")) );
  animals.push_back( std::unique_ptr<Animal>(new Cat("Snowball")) );
}

純粋仮想メソッドを作成Animal::speak()し、仮想デストラクタを指定した場所。Animal

仮想デストラクタを使用する場合と、仮想メソッドを pure にする必要がある場合を確認してください。

于 2012-11-04T12:41:44.797 に答える
2

likeをプッシュしたい場合はvectorasを宣言する必要があります。そして、ポリモーフィズムを使用できるようにするために、ポインターが必要です。さらに、基本クラスの animal にもメソッドが必要です。そうしないと、コンパイル時に. これらの変更が行われると、期待どおりに機能するはずです。vector<Animal*>Animal*skipspeak()Animal

于 2012-11-04T12:43:30.203 に答える