使用包含不可复制数据类型的类的向量

use*_*207 9 c++ stdvector

我的问题是我有一个包含std :: ifstream,std :: ofstream和std :: mutex的类.这些对象都不能直接复制,如下例所示.

std::ifstream stream1;
std::ifstream stream2;
stream1 = stream2; //<-Compiler Error!
Run Code Online (Sandbox Code Playgroud)

我的问题不是我要复制我的类的任何实例,而是vector中的push_back()函数试图为我的类调用复制构造函数.我设计了一个复制我的问题并将其粘贴在下面的示例.

#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;
}
Run Code Online (Sandbox Code Playgroud)

我在试图弄清楚如何解决这个错误时遇到了问题.任何帮助将不胜感激.请记住,我永远不会直接调用复制构造函数,因为我在实际场景中不需要复制此类的实例,但似乎push_back正在调用它并且我在尝试覆盖它时失败了.

编辑:我认为解决它的一种方法是使用指针而不是ifstream,ofstream和mutex对象,但我宁愿不惜一切代价避免这种情况.

Sam*_*hik 5

真正的问题是此类包含一个std::mutex成员。无法复制/移动。这意味着具有互斥量成员的类不喜欢驻留在向量中。

您需要为您的类自定义复制和/或移动构造函数,并实现适当的语义以复制流,并弄清楚要使用互斥量做什么。


小智 4

您可以尝试使用指向对象的指针向量。最好使用某种智能指针,而不是原始指针向量。

即 std::vector< std::shared_ptr< MyClass >> MyVector;

现在你有了一个指向 MyClass 对象的指针的容器。