访问包含列表

时间:2016-10-01 03:06:10

标签: c++ stl

我一直试图让这个工作几个星期了。而且我很尴尬。而且我觉得好像答案可能非常简单。

我想定义一种包含列表的对象(即类),例如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;第一个是直接访问,第二个是迭代器。)

连连呢?我做错了什么绝对愚蠢的事?

2 个答案:

答案 0 :(得分:2)

ListA(const ListA& orig){}

您的类具有显式声明的复制构造函数,不会复制任何内容。

当您声明一个复制构造函数时,您将根据要复制的对象的内容完全负责构造新对象。

您的构造函数不执行任何操作。你最终构造了一个空对象。

dishes.push_back(ingredientsA);

所以,你创建一个列表。然后通过ingredientsApush_back()复制到列表的末尾。

由于您的复制构造函数并未真正复制任何内容,因此您最终会将完全空的类实例复制到dishes列表中。

摆脱你的显式复制构造函数。它没有明显的目的。

答案 1 :(得分:0)

//add to our list of entries
list< ListA > dishes;
dishes.push_back(ingredientsA);
dishes.push_back(ingredientsB);

使用复制构造函数将 List 放入 std :: list ,您的复制构造函数会覆盖默认值并且不执行任何操作