使用带向量的自定义类:'std :: vector'默认构造函数错误

时间:2015-10-13 18:16:08

标签: c++ c++11 vector

编辑:添加默认构造函数没有任何改变,但在库构造函数中添加: itemlist(0)初始化程序会删除该特定错误。但是,仍会出现这两个错误的多个实例:

'Item': undeclared identifier

'std::vector': 'Item' is not a valid template type argument for parameter '_Ty'

我想知道这两个不同的课程是否存在某种范围问题?

我正在尝试创建一个定义Item的类和另一个定义Inventory的类,其中包含Items的向量列表。但是,通过下面的解决方案,我遇到了多个错误,最明显的是

'std::vector': no appropriate default constructor available

......以及其他我只能从​​中承担责任的人。这是我的定义:

header.h

#include <iostream>
#include <string>
#include <vector>
#include "Item.h"
#include "Inventory.h"

Item.h

#include "header.h"
class Item
{
private:
    std::string name;
public:
    Item(std::string n, std::string d, int c);
    std::string getName();
};

Item.cpp

#include "header.h"
using namespace std;

Item::Item(string n)
{
    name = n;
}

string Item::getName()
{
    return name;
}

Inventory.h

#include "header.h"

class Inventory
{
private:
    std::vector<Item> itemlist;

public:
    Inventory();
    std::string getInventory();
    void addItem(Item x);
};

Inventory.cpp

#include "header.h"
using namespace std;

Inventory::Inventory()
{
}

string Inventory::getInventory()
{
    string output = "";

    for (int i = 0; i <= itemlist.size(); i++)
    {
        output = output.append(itemlist[i].getName());
    }

    return output;
}

void Inventory::addItem(Item x)
{
    itemlist.push_back(x);
}

我有一种感觉,这与我的自定义对象有某种关系,在某种程度上我试图使用它们的方式与向量不兼容。所有这些都存在根本性的错误,或者我在某个地方犯了一个简单的错误?

2 个答案:

答案 0 :(得分:3)

您需要使用默认构造函数来使用std :: vector。默认构造函数是没有参数的构造函数,即Item::Item() { ... }

答案 1 :(得分:0)

std::vector<> s reference documentation(强调我的)所述:

  

T 元素的类型。
        必须符合 CopyAssignable和CopyConstructible 的要求   对元素施加的要求取决于对容器执行的实际操作。通常,要求元素类型是完整类型并且满足Erasable的要求,但许多成员函数强加了更严格的要求。

因此,您仍需要提供复制构造函数和赋值运算符。 <{1}}实例化后,还需要完全声明Item

如果无法为您的班级提供所需的功能,您可以在vector<Item>中存储智能指针,例如:

vector

std::vector<std::unique_ptr<Item>> itemlist;

这样做的好处是您不会一直复制std::vector<std::shared_ptr<Item>> itemlist; 个实例。