std :: list,无法访问对象

时间:2016-09-23 16:16:28

标签: c++

我是cpp的新手并希望了解列表。 当我运行我的程序时它编译得很好,但我没有得到结果 我期待着。

这给了我输出

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;
}

2 个答案:

答案 0 :(得分:4)

您没有任何东西的原因是您的复制构造函数不正确。当您将temp添加到列表中时,您会复制Animal::Animal(const Animal& orig) { } ,并且您正在访问此副本。

你有

$("button").click(function () {
    var first_num  = Number($("input[name='first_num']").val());
    var second_num = Number($("input[name='second_num']").val());
    $("input[name='sum_of_num']").val(first_num + second_num);
});

这意味着当你复制时,该类的所有成员都是默认初始化的,没有其他任何事情发生。

最简单的解决方案就是摆脱它,让编译器提供默认的拷贝构造函数为你做副本。

答案 1 :(得分:3)

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

这是一个(空)复制构造函数。因此,在复制班级的对象时,例如当你...

animal_list.push_back(temp);

...将其添加到列表中,副本不会正确设置成员。

解决方案:只需删除该复制构造函数(以及析构函数)。请参阅rule of zero