使用包含不可复制数据类型的 类 向量
Using vectors with classes that contain non-copyable data types
我的问题是我有一个 class,其中包含 std::ifstream、std::ofstream 和 std::mutex。 None 个对象可以直接复制,如下例所示。
std::ifstream stream1;
std::ifstream stream2;
stream1 = stream2; //<-Compiler Error!
我的问题不是我想复制我的 class 的任何实例,而是向量中的 push_back() 函数试图为我的 [=26= 调用复制构造函数].我设计了一个复制我的问题的示例并将其粘贴在下面。
#include <fstream> //for std::ifstream // std::ofstream
#include <vector> //for std::vector
#include <mutex> //for std::mutex
class MyClass
{
public:
MyClass(int ID) : ID(ID) { }
std::ofstream outputstream;
std::ifstream inputstream;
std::mutex mymutex;
private:
int ID;
};
int main()
{
std::vector<MyClass> MyVector;
MyVector.push_back(MyClass(1)); //<-- Error C2280 'MyClass::MyClass(const MyClass &)': attempting to reference a deleted function
return 0;
}
我在尝试找出解决此错误的方法时遇到问题。任何帮助将不胜感激。请记住,我永远不会直接调用复制构造函数,因为在我的实际场景中我不需要复制此 class 的实例,但似乎 push_back 正在调用它并且我有我试图覆盖它但没有成功。
编辑:我认为解决它的一种方法是使用指针而不是 ifstream、ofstream 和互斥对象,但我宁愿不惜一切代价避免这种情况。
由于您可以访问 C++11 功能,因此可以使用 emplace_back 来构建适当的元素。
MyVector.emplace_back(1);
但是,std::mutex
有一些问题。该成员必须是指针才能使上述工作正常。否则,您可以将 class 的所有元素更改为可复制的类型(例如,指针)。
您可以尝试使用指向对象的指针向量。最好使用某种智能指针,而不是原始指针向量。
即
std::vector>MyVector;
现在您有一个指向 MyClass 对象的指针容器。
这里真正的问题是这个 class 包含一个 std::mutex
成员。不能是 copied/moved。这意味着 class 具有互斥成员的元素不喜欢存在于向量中。
您需要一个自定义副本 and/or 移动构造函数,用于您的 class,并实现适当的语义来复制流,并弄清楚您想要对互斥体做什么。
我的问题是我有一个 class,其中包含 std::ifstream、std::ofstream 和 std::mutex。 None 个对象可以直接复制,如下例所示。
std::ifstream stream1;
std::ifstream stream2;
stream1 = stream2; //<-Compiler Error!
我的问题不是我想复制我的 class 的任何实例,而是向量中的 push_back() 函数试图为我的 [=26= 调用复制构造函数].我设计了一个复制我的问题的示例并将其粘贴在下面。
#include <fstream> //for std::ifstream // std::ofstream
#include <vector> //for std::vector
#include <mutex> //for std::mutex
class MyClass
{
public:
MyClass(int ID) : ID(ID) { }
std::ofstream outputstream;
std::ifstream inputstream;
std::mutex mymutex;
private:
int ID;
};
int main()
{
std::vector<MyClass> MyVector;
MyVector.push_back(MyClass(1)); //<-- Error C2280 'MyClass::MyClass(const MyClass &)': attempting to reference a deleted function
return 0;
}
我在尝试找出解决此错误的方法时遇到问题。任何帮助将不胜感激。请记住,我永远不会直接调用复制构造函数,因为在我的实际场景中我不需要复制此 class 的实例,但似乎 push_back 正在调用它并且我有我试图覆盖它但没有成功。
编辑:我认为解决它的一种方法是使用指针而不是 ifstream、ofstream 和互斥对象,但我宁愿不惜一切代价避免这种情况。
由于您可以访问 C++11 功能,因此可以使用 emplace_back 来构建适当的元素。
MyVector.emplace_back(1);
但是,std::mutex
有一些问题。该成员必须是指针才能使上述工作正常。否则,您可以将 class 的所有元素更改为可复制的类型(例如,指针)。
您可以尝试使用指向对象的指针向量。最好使用某种智能指针,而不是原始指针向量。
即
std::vector
现在您有一个指向 MyClass 对象的指针容器。
这里真正的问题是这个 class 包含一个 std::mutex
成员。不能是 copied/moved。这意味着 class 具有互斥成员的元素不喜欢存在于向量中。
您需要一个自定义副本 and/or 移动构造函数,用于您的 class,并实现适当的语义来复制流,并弄清楚您想要对互斥体做什么。