【问题标题】:How to add a 'new' class to a vector如何将“新”类添加到向量
【发布时间】:2010-09-22 23:33:59
【问题描述】:

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

【问题讨论】:

  • 这没有什么问题,你声明clients向量的那一行是什么样的?
  • 你有a good introductory C++ book, 对吗?如果没有,你真的需要买一本读一读。我从您的帖子中猜想您可能不了解 C++ 中内存管理的基础知识,而且这是一个充满常见陷阱的领域。
  • 可能你的向量没有被声明为vector&lt;client*&gt;,而是vector&lt;client&gt;

标签: c++


【解决方案1】:

您几乎可以肯定只是想摆脱new,所以它是:

clients.push_back(client(addr, fd));

在 Java 中,您必须显式地 new 所有对象,但在 C++ 中,您不仅不需要,而且通常希望在合理的情况下避免它。

【讨论】:

  • 我认为你说错了。 new 不是“可选的”,但与声明自动实例完全不同。通常,它们不能互换。 (不过,在这种情况下,除非向量的明显有缺陷的声明被更改,否则不应使用 new(添加 * 以通过语法检查),因为它会产生泄漏,并且因为它会导致不必要的额外工作。)
  • @Daniel:再次阅读问题。对于 OP 的要求,杰里当然给出了正确的答案。这当然并不意味着new 总体上不好,但是他没有这么说。 OP 需要的是a good C++ book。而且相当紧急。
【解决方案2】:

您是如何创建矢量的?

您需要传递Client* 的模板参数,因此如果您想在其中存储指针,您将拥有std::vector&lt;Client*&gt; clients;。如果您使用此方法并使用指向堆上内存的原始指针(例如使用 new 创建时),请记住您最终需要遍历向量的每个元素并在每个元素上调用 delete

或者,如果您不介意复制您的客户端对象,您可以使用std::vector&lt;Client&gt; clients;,然后调用clients.push_back(myClient);

【讨论】:

    【解决方案3】:

    假设您可以使用 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);
    

    当客户端被推送到向量时,会生成一份客户端副本。

    【讨论】:

    • 两个示例中的clients 声明实际上是在本地声明返回std::vector 的函数。您需要删除括号才能使代码正常工作。
    • 哎呀-我的嘘声。已更正。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多