gpt4 book ai didi

c++ - 无法使对象不可复制

转载 作者:行者123 更新时间:2023-11-27 23:01:18 24 4
gpt4 key购买 nike

我正在为网络编程制作一个服务器接口(interface),但遇到了一个问题。我想让一个服务器对象不可复制,主要是因为这样做没有意义并且可能会产生问题,还因为它使用了无法复制的线程。但是,当我将复制构造函数和赋值运算符设为私有(private)时,出现错误:

Error   2   error C2248: '(namespaces..)::Server::Server' : cannot access private member declared in class '(namespaces..)::Server' (path..)\type_traits    1545    1   Server

错误似乎在type_traits 文件中?我根本没有使用过它,尽管我包含的其他一些 std 文件可能会使用它?我正在使用 iostream、sstream、string、thread、map

这是服务器类定义:

class DLL_PUBLIC Server
{
public:
Server(unsigned int);
~Server();

(...)
private:
class PvtImpl; //Private implementation, so it isn't seen in the header file
PvtImpl *pvtImpl;

Server(const Server &par_other){}
Server& operator=(const Server &par_other){ return *this; }

(...)
};

和私有(private)实现:

class Server::PvtImpl
{
public:
bool running;
unsigned int port, backlog, currentlyConnected;
SOCKET listenSocket;
std::thread *acceptConnectionsThread;
std::thread* *receiveDataThreads; //I am using pointers instead of vectors because I want it to be fixed
ClientObj* *clients;
std::map<ClientObj*, unsigned int> clientIndexMap;
};

既然我不知道要发布什么代码,因为我什至不知道错误来自哪里,那么如果您需要发布它的特定部分,请告诉我。如果我注释掉私有(private)复制构造函数和赋值运算符,那么它就可以工作,但我不希望它是可复制的,尤其是不能通过默认构造函数复制。有点怀疑,但是跟是DLL有关系吗?

就这样吧,谢谢你的时间

更新

所以我按照建议在构造函数中添加了一个= delete,并将其公开:

class DLL_PUBLIC Server
{
public:
Server(unsigned int);
Server(const Server &par_other) = delete;
~Server();

Server& operator=(const Server &par_other) = delete;

(...)
};

我现在遇到了一些不同的错误,但也在 type_traits 文件中:

Error   2   error C2280: '(namespaces..)::Server::Server(const (namespaces..)::Server &)' : attempting to reference a deleted function  (path..)\type_traits    1545    1   Server

它在该文件中提示的一些代码:

// TEMPLATE FUNCTION _Decay_copy
template<class _Ty> inline
typename decay<_Ty>::type _Decay_copy(_Ty&& _Arg)
{ // forward _Arg as value of decayed type
return (_STD forward<_Ty>(_Arg));
}
_STD_END

更新 2

这是 VS 请求的输出窗口:

1>(path...)\type_traits(1545): error C2280: '(namespaces..)::Server::Server(const (namespaces..)::Server &)' : attempting to reference a deleted function
1> (path..)\Server.h(19) : see declaration of '(namespaces..)::Server::Server'
1> (path..)\thread(47) : see reference to function template instantiation '(namespaces..)::Server std::_Decay_copy<(namespaces..)::Server&>(_Ty)' being compiled
1> with
1> [
1> _Ty=(namespaces..)::Server &
1> ]
1> Server.cpp(94) : see reference to function template instantiation 'std::thread::thread<void(__cdecl &)(const (namespaces..)::Server &),(namespaces..)::Server&>(_Fn,(namespaces..)::Server &)' being compiled
1> with
1> [
1> _Fn=void (__cdecl &)(const (namespaces..)::Server &)
1> ]

它提到的 Server.h 中的第 19 行是复制构造函数声明。 Server.cpp中第94行是线程创建:

pvtImpl->acceptConnectionsThread = new std::thread(acceptConnections, *this);

acceptConnections 函数通过常量引用获取服务器,因此它不应复制,声明如下:

friend void acceptConnections(const Server&);

最佳答案

您的问题很可能在线程构造函数中:

pvtImpl->acceptConnectionsThread = new std::thread(acceptConnections, *this);

试试这个:

pvtImpl->acceptConnectionsThread = new std::thread(acceptConnections, std::ref(*this));

因为没有 std::ref() 包装器,您的服务器实例的拷贝 将被传递到线程构造函数中,线程构造函数又会通过引用将该拷贝传递给您的 acceptConnections() 方法.或者至少尝试这样做,但它从来没有走到那一步,因为编译器未能完成初始拷贝。

关于c++ - 无法使对象不可复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27333135/

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