编辑:添加默认构造函数没有任何改变,但在库构造函数中添加: 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);
}
我有一种感觉,这与我的自定义对象有某种关系,在某种程度上我试图使用它们的方式与向量不兼容。所有这些都存在根本性的错误,或者我在某个地方犯了一个简单的错误?
答案 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;
个实例。