簡體   English   中英

使用包含不可復制數據類型的類的向量

[英]Using vectors with classes that contain non-copyable data types

我的問題是我有一個包含std :: ifstream,std :: ofstream和std :: mutex的類。 這些對象都不能直接復制,如下例所示。

std::ifstream stream1;
std::ifstream stream2;
stream1 = stream2; //<-Compiler Error!

我的問題不是我要復制我的類的任何實例,而是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;
}

我在試圖弄清楚如何解決這個錯誤時遇到了問題。 任何幫助將不勝感激。 請記住,我永遠不會直接調用復制構造函數,因為我在實際場景中不需要復制此類的實例,但似乎push_back正在調用它並且我在嘗試覆蓋它時失敗了。

編輯:我認為解決它的一種方法是使用指針而不是ifstream,ofstream和mutex對象,但我寧願不惜一切代價避免這種情況。

由於您可以訪問C ++ 11功能,因此可以使用emplace_back來構建元素。

MyVector.emplace_back(1);

但是, std::mutex存在一些問題。 該成員必須是一個指針才能使上述工作。 否則,您可以將類的所有元素更改為可復制的類型(例如,指針)。

這里真正的問題是這個類包含一個std::mutex成員。 哪個無法復制/移動。 這意味着具有互斥成員的類不喜歡居住在向量中。

您需要為您的類創建自定義副本和/或移動構造函數,並實現相應的語義來復制流,並找出您要對互斥鎖執行的操作。

您可以嘗試使用指向對象的向量。 最好使用某種智能指針,而不是原始指針的向量。

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

現在你有一個指向MyClass對象的指針的容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM