2016-09-23 7 views
-2

私はcppを初めて使い、リストについて知りたいです。 プログラムを実行するとコンパイルは正常ですが、結果が得られません 私は期待しています。std :: list、オブジェクトにアクセスできない

これは私に出力

Legs: 0 Name: 

を与えることは

Legs 4 Name: dog 

いずれかが問題を見ることができすべきですか?

コメント欄にあるように、私は1時間以上かけて試してみましたが、これをうまく動作させるには問題は見えません。

ヘッダファイル

using namespace std; 

#ifndef ANIMAL_H 
#define ANIMAL_H 

class Animal { 
public: 
    Animal(); 
    Animal(const Animal& orig); 
    virtual ~Animal(); 

    int _Legs; 
    void SetName(string name); 
    string GetName(); 
private: 
    string _Name; 
}; 

#endif /* ANIMAL_H */ 

Animal.cpp

Animal::Animal() { 
    } 

    Animal::Animal(const Animal& orig) { 
    } 

    Animal::~Animal() { 
    } 

    string Animal::GetName(){return _Name;} 

    void Animal::SetName(string name){_Name = name;}; 

あなたは何もありません理由は、あなたのコピーコンストラクタです

void List() 
{ 

    std::list<Animal> animal_list; 

    Animal temp; 

    temp = Animal(); 
    temp._Legs = 4; 
    temp.SetName("Dog"); 
    animal_list.push_back(temp); 


for(std::list<Animal>::iterator list_iter = animal_list.begin(); 
    list_iter != animal_list.end(); list_iter++) 
{ 
    std::cout<< "Legs:" << list_iter->_Legs << " Name: " << list_iter->GetName() << endl; 
} 


} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow) 
{ 

    List(); 
    return 0; 
} 
+1

おそらくあなたはそのコピーコンストラクタを実装する必要がありますか?つまり、実際に何かをしたり、完全に取り除いたりします。 –

+1

'Animal'の空のコピーコンストラクタがありますか?実際に何を期待していますか?いずれかを定義しないでコンパイラが生成したものを使用するか、定義内のクラスメンバー変数をコピーします。 –

+3

また、(あなたの問題とは関係ありませんが)名前の先頭にアンダースコアを付け、その後に大文字を付けるべきです。 [それらはすべてのスコープで予約されている](http://stackoverflow.com/a/228797/440558)。 –

答えて

4

メインのファイルが正しくありません。リストに追加するときにtempのコピーを作成します。このコピーはアクセスしています。

あなたはコピーを作成する際、クラスのすべてのメンバーがデフォルトに初期化されることを意味し、他に何も起こりません

Animal::Animal(const Animal& orig) { 
} 

を持っています。

最も簡単な解決策は、それを取り除き、デフォルトのコピーコンストラクタが提供するコンパイラにコピーを渡すことです。

3
Animal::Animal(const Animal& orig) { 
} 

これは(空の)コピーコンストラクタです。したがって、あなたのクラスのオブジェクトをコピーするとき、例えば。あなたが...

animal_list.push_back(temp); 

...リストに追加すると、そのメンバーは適切に設定されません。

解決方法:そのコピーコンストラクタ(およびデストラクタ)を削除してください。 rule of zeroを参照してください。

+0

デストラクタはなぜですか?私はそれが何もしないことを知っていますが、いかなる害を及ぼすべきではありませんか?え? – Niklas

関連する問題