[英]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.