gpt4 book ai didi

c++ - 使用互斥量时尝试引用已删除的函数

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

我在处理项目时遇到奇怪的错误。我创建了一个 super 简单的示例来重现错误。

我创建了一个类。我想在这个类中做的是为我的类提供一种“getter”函数来填充 struct 的值。在主应用程序中,用户将实例化此 struct,将其传递给成员函数,并能够在返回时读取 struct 中的值。由于实际类的设计,这必须在单独的线程中发生。这是我拥有的:

我的类.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__ */

我的类.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;
}

主要.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 添加为类的私有(private)成员,当我尝试运行代码时会收到以下消息:

错误 1 ​​error C2280: 'std::mutex::mutex(const std::mutex &)' : attempted to reference a deleted function ...

1) 我正在尝试了解为什么会收到此错误。

2)(这部分更多地基于意见),根据信息,这种填充公共(public)结构的“ setter/getter ”方式是否是一个好的设计,以便实现我的类的人可以弄乱其中的变量?有更好的方法吗?

最佳答案

myclass 中没有复制构造函数,所以编译器给它一个默认的复制构造函数。这将尝试复制所有成员,包括您的 std::mutex,它是不可复制的。正如编译器错误所说,它被标记为已删除。

你需要自己定义拷贝构造函数;您很可能希望它获取存储在被复制实例中的互斥锁,然后将它的所有其他成员复制到新实例。

关于c++ - 使用互斥量时尝试引用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28311049/

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