将自定义类与向量一起使用:'std::vector'默认构造函数错误
Using custom class with vectors: 'std::vector' default constructor error
我试图创建一个定义项目的类和另一个定义库存的类,包含项目的矢量列表。然而,使用下面的解决方案,我得到了多个错误,最明显的是
'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);
}
我有一种感觉,这与我的自定义对象在我试图使用它们的方式中与向量不兼容有关。这一切有什么根本的问题吗,还是我只是犯了一个简单的错误?
添加一个默认构造函数没有改变什么,但是添加一个: itemlist(0)
初始化器到Inventory构造函数消除了这个特定的错误。但是,这两个错误的多个实例仍然会出现:
'Item': undeclared identifier
和
'std::vector': 'Item' is not a valid template type argument for parameter '_Ty'
我想知道是否有某种作用域问题发生在这里关于我的两个独立的类?
您需要有一个默认构造函数来使用std::vector。默认构造函数是没有参数的构造函数,即Item::Item() { ... }
在std::vector<>
的参考文档(重点是我的)中提到:
T元素的类型
必须满足CopyAssignable和CopyConstructible的要求。
施加在元素上的需求取决于在容器上执行的实际操作。一般要求元素类型为完整类型,且满足Erasable的要求,但许多成员函数的要求更严格。
所以仍然需要提供复制构造函数和赋值操作符。当实例化vector<Item>
时,也需要完全声明Item
。
你可以存储一个智能指针在你的vector
虽然,如果不可能为你的类提供所需的功能,例如:
std::vector<std::unique_ptr<Item>> itemlist;
或
std::vector<std::shared_ptr<Item>> itemlist;
这样做的好处是不需要一直复制Item
实例。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用 std::分配器在 constexpr 中进行默认初始化
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- std::map:当元素不可默认构造时创建/替换元素
- 如何默认启动 std::vector
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 静态std::unordereded_map的默认值
- 为什么用默认构造函数构造std::string对象时行为不同
- std::tuple默认构造函数,带有move可构造元素
- 默认情况下,"std::shared_ptr"不应该使用"std::d efault_delete"吗?
- 没有适用于 std::unique_ptr 的适当默认构造函数
- 当 T 不可默认构造时,构造函数初始值设定项列表中 std::array<T,N> 的初始化
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- std::vector 默认构造函数可以抛出异常吗?
- 使用默认值初始化 std::数组