2016-09-23 68 views
-2

我是新來的cpp,想了解列表。 當我運行我的程序它編譯好,但我沒有得到結果 我期待。std :: list,無法訪問對象

這給了我輸出

Legs: 0 Name: 

應該

Legs 4 Name: dog 

任何一個可以看這個問題?

正如在註釋部分,我已經試過了一個多小時,並得到得到這個工作,不能看到這個問題。

頭文件

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

爲什麼析構函數?我知道它沒有做任何事情,但不應該有任何傷害? RIght.'? – Niklas