gpt4 book ai didi

c++ - 错误:使用已删除的函数'test::test (const test&) C++ 结合 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:15 27 4
gpt4 key购买 nike

我有一个我不明白的问题。我有一个生成线程的类。一切都好。我制作了一个新对象 - 一切正常。如果我将这些存储在一个 vector 中以迭代我的代码将无法编译。我使用 g++ 4.9 i686。我制作了以下简短程序,它完全模拟了问题,因为真实代码相当广泛。如果有人可以澄清或给我一个对我的宠物项目非常有用的解决方案,因为我坚持这个。代码如下:

#include <thread>
#include <string>
#include <iostream>
#include <vector>

class test
{
public:
test();
void setstring(std::string s);
~test() { }
void runThread() { m_thread = std::thread(&test::print, this); }
void stop() {on=false;m_thread.join(); }
private:
std::string s;
bool on=false;
std::string m_data;
std::thread m_thread;
void print();
};

test::test(){s="";m_data="";}

void test:: print() { std::cout << "I'm running" << '\n'; on = true;
while(on==true){std::cout << m_data << '\n';}
}

void test:: setstring(std::string s){m_data = s;}

int main()
{
//this works
test one ;
one.setstring("thread running");
one.runThread();
getchar();
one.stop();
std::cout << "I've stopped" << '\n';

std::vector<test> testvec;
test *tst;
tst= new test;
//testvec.push_back(*tst); //FAILES TO COMPILE
delete tst;
}

最佳答案

std::vector::push_back的版本您正在使用需要一个可复制的对象,而您的类是不可复制的。原因是std::thread不可复制

thread(const thread&) = delete;

因为它是不可复制的,所以你的类的默认复制构造函数被删除。

要将默认的test 添加到testvec,您可以使用std::vector::emplace_back

testvec.emplace_back();

或者通过在调用 push_back

时构造一个临时的 in
testvec.push_back(test());

这将调用 push_back() 的右值引用重载

您还需要摆脱构造函数和析构函数,因为它们会阻止自动创建您类需要正常工作的移动构造函数。一条经验法则是,如果您的类仅包含 POD 类型或类 POD 类型(自行处理的对象),那么您无需创建任何构造函数,因为编译器提供的构造函数将起作用。

关于c++ - 错误:使用已删除的函数'test::test (const test&) C++ 结合 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34362844/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com