如何向矢量添加“新”类

时间:2010-09-22 23:34:00

标签: c++

我正在用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 ++的指针和内存。

3 个答案:

答案 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);

当将其推送到矢量时,将发生客户端的副本。