我在项目上遇到了一个奇怪的错误。我创建了一个非常简单的例子来重新创建错误。
我创建了一个课程。我想在这堂课中做的是为我的班级设置一种“getter”功能,填充struct
的值。在主应用程序中,用户将实例化此struct
,将其传递给成员函数,并在返回时能够读取struct
中的值。由于实际类的设计,这必须在一个单独的线程中发生。这就是我所拥有的:
myClass.h:
#ifndef __MY_CLASS_H__
#define __MY_CLASS_H__
#include <mutex>
class myClass {
public:
struct my_struct_s {
int field1;
short field2;
};
int get_data(my_struct_s & my_struct);
private:
};
#endif /* __MY_CLASS_H__ */
myClass.cpp:
#include "myClass.h"
int myClass::get_data(struct my_struct_s & my_struct)
{
int var1 = 5;
char var2 = 2;
my_struct.field1 = var1;
my_struct.field2 = var2;
return 0;
}
Main.cpp的:
#include "myClass.h"
#include <iostream>
#include <thread>
#include <Windows.h>
bool thread_running;
std::thread thread;
void run_thread(myClass & lmyClass)
{
myClass::my_struct_s my_struct;
while (thread_running) {
lmyClass.get_data(my_struct);
std::cout << my_struct.field1 << std::endl;
std::cout << my_struct.field2 << std::endl;
Sleep(100);
}
}
int main(int argc, char *argv[])
{
myClass lmyClass;
thread_running = true;
thread = std::thread(run_thread, lmyClass);
Sleep(1000);
thread_running = false;
if (thread.joinable()) {
thread.join();
}
getchar();
return 0;
}
它按预期工作。但是,由于类的异步特性,我需要使用互斥锁来保护在类中不同线程中处理的数据。
如果我添加std::mutext
作为我班级的私人成员,我在尝试运行代码时会收到以下内容:
Error 1 error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function ...
1)我试图理解为什么我收到这个错误。
2)(这部分是基于意见的一点),给定信息,这是填充公共结构的“getter”方式,以便实现我的类的人可以搞乱其中的变量一个好的设计?有没有更好的方法呢?
答案 0 :(得分:10)
您在myclass
中没有复制构造函数,因此编译器会为其提供默认的复制构造函数。这将尝试复制所有成员,包括不可复制的std::mutex
。正如编译器错误所示,它被标记为已删除。
您需要定义自己的复制构造函数;您很可能希望它获取存储在正在复制的实例中的互斥锁,然后将其所有其他成员复制到新实例。
答案 1 :(得分:-1)
动态声明您的互斥锁,而不是静态声明。
在myClass类头中,将互斥锁声明为指针,如下所示:
mutex * mtx;
并在您的构造函数中初始化调用其构造函数的互斥锁:
mtx = new std::mutex();