我一直试图让这个工作几个星期了。而且我很尴尬。而且我觉得好像答案可能非常简单。
我想定义一种包含列表的对象(即类),例如class ListA {string category;列表<字符串>配料;…}。然后我想创建一个这些对象的列表,例如列表< ListA> MYMENU。正如你已经猜到的那样,我无法让它发挥作用。
以下是代码:
#include <iostream>
#include <list>
using namespace std;
class ListA {
public:
string category;
list<string> items;
ListA() { category = "Unentitled"; }
ListA(const ListA& orig){}
~ListA(){}
};
int main(int argc, char** argv) {
cout<<"\n\nTEST a6.3: Let's try an example that is more complete. ";
//setup lists for each entree
ListA ingredientsA;
ingredientsA.category="Pizza";
ingredientsA.items.push_back("tomatos"); ingredientsA.items.push_back("garlic");
ingredientsA.items.push_back("cheese"); ingredientsA.items.push_back("dough");
ListA ingredientsB;
ingredientsB.category="Milk shake";
ingredientsB.items.push_back("milk"); ingredientsB.items.push_back("ice cream");
ingredientsB.items.push_back("cocoa"); ingredientsB.items.push_back("whip cream");
//verify contents of lists are correctly added
cout<<"\nTEST a.6.3.2[Category("<<ingredientsB.category<<")]";
cout<<"\nTEST a.6.3.4[Ingredient("<<ingredientsB.items.front()<<")]";
//add to our list of entries
list< ListA > dishes;
dishes.push_back(ingredientsA);
dishes.push_back(ingredientsB);
//grab first entree in dishes list just added, what the heck?
ListA tmpa = dishes.front();
cout<<"\nTEST a.6.3.5[Category("<<tmpa.category<<")]";
cout<<"\nTEST a.6.3.6[Ingred size("<<tmpa.items.size()<<")]\n";
//same with iterator
list< ListA >::iterator itra = dishes.begin();
cout<<"\nTEST a.6.3.5[Category("<<itra->category<<")]";
cout<<"\nTEST a.6.3.6[Ingred size("<<itra->items.size()<<")]\n";
return 0;
}
输出:
TEST a6.3: Let's try an example that is more complete.
TEST a.6.3.2[Category(Milk shake)]
TEST a.6.3.4[Ingredient(milk)]
TEST a.6.3.5[Category()]
TEST a.6.3.6[Ingred size(0)]
TEST a.6.3.5[Category()]
TEST a.6.3.6[Ingred size(0)]
RUN FINISHED; exit value 0; real time: 10ms; user: 0ms; system: 0ms
我创建了列表&lt; ListA&gt ;,将ListA对象添加到它,它们立即尝试访问该列表的元素,并且无法访问dang事物。 (见a.6.3.5&amp; .6;第一个是直接访问,第二个是迭代器。)
连连呢?我做错了什么绝对愚蠢的事?
答案 0 :(得分:2)
ListA(const ListA& orig){}
您的类具有显式声明的复制构造函数,不会复制任何内容。
当您声明一个复制构造函数时,您将根据要复制的对象的内容完全负责构造新对象。
您的构造函数不执行任何操作。你最终构造了一个空对象。
dishes.push_back(ingredientsA);
所以,你创建一个列表。然后通过ingredientsA
将push_back()
复制到列表的末尾。
由于您的复制构造函数并未真正复制任何内容,因此您最终会将完全空的类实例复制到dishes
列表中。
摆脱你的显式复制构造函数。它没有明显的目的。
答案 1 :(得分:0)
//add to our list of entries
list< ListA > dishes;
dishes.push_back(ingredientsA);
dishes.push_back(ingredientsB);
使用复制构造函数将 List 放入 std :: list ,您的复制构造函数会覆盖默认值并且不执行任何操作