我正在用C ++编写服务器并创建了一个名为client的类来存储有关已连接客户端的信息。我想将客户端存储在一个向量中。我有一个电话
clients.push_back(new client(addr,fd));
将客户端对象添加到矢量客户端。我在编译时遇到以下错误
server.cpp:67: error: no matching function for call to ‘std::vector<client, std::allocator<client> >::push_back(client*)
我认为这与我对new
关键字的误解以及如何在C ++中存储/移动数据有关。我来自Java背景,所以我不习惯使用C ++的指针和内存。
答案 0 :(得分:4)
你是如何创建矢量的?
如果要在内部存储指针,则需要传递Client*
的模板参数,以便拥有std::vector<Client*> clients;
。如果您使用此方法并使用指向堆上内存的原始指针(例如使用new创建时),请记住您最终需要遍历向量的每个元素并在每个元素上调用delete
。
或者,如果您不介意复制客户端对象,可以使用std::vector<Client> clients;
,然后拨打clients.push_back(myClient);
答案 1 :(得分:4)
你几乎肯定只想摆脱new
所以它是:
clients.push_back(client(addr, fd));
在Java中,您必须明确new
所有对象,但在C ++中,您不仅不需要,而且通常希望在完全合理时避免使用它。
答案 2 :(得分:0)
假设您可以使用boost库,您可能还需要考虑类似(未经测试)的内容:
typedef ClientSharedPtr boost::shared_ptr<Client>;
std::vector<ClientSharedPtr > clients;
ClientSharedPtr client(new Client());
clients.push_back(client);
这样,您就可以获得自动管理客户端的指示。
或者,考虑在客户端上提供复制构造函数,然后:
std::vector<Client> clients;
Client client;
clients.push_back(client);
当将其推送到矢量时,将发生客户端的副本。