【问题标题】:How to create an array of smart pointers?如何创建一个智能指针数组?
【发布时间】:2014-11-25 02:02:21
【问题描述】:

我创建了一个类,它引用一些成员作为智能指针,我想创建一个此类的数组,但我得到了不同类型的错误

class ConnectionType : public SimpleRefCount<ConnectionType> {
public:
  Ptr<Socket> txMstrSocPtr; /// Pointer to Master tx socket
  Ptr<Socket> rxMstrSocPtr; /// Pointer to Master rx socket
  Ptr<Socket> txSlavSocPtr; /// Pointer to Slave tx socket
  Ptr<Socket> rxSlavSocPtr; /// Pointer to Slave rx socket

  //ConnectionType();
  //~ConnectionType();

  void rxMstrCallBack(Ptr<Socket> socket);
  void rxSlavCallBack(Ptr<Socket> socket);
};

Ptr<ConnectionType> ConnectionArray[NUMBER_OF_CONNECTIONS] = CreateObject<ConnectionType>();

它给了我错误 错误 1 ​​错误 C2075:“ConnectionArray”:数组初始化需要大括号
2 IntelliSense:聚合对象需要使用“{...}”进行初始化

【问题讨论】:

  • 你不能返回一个数组。不过,您可以返回 vector&lt;Ptr&lt;ConnectionType&gt;&gt;
  • 能不能写的详细一点(语法完整),对不起,我是这个领域的新手

标签: c++ arrays smart-pointers ns-3


【解决方案1】:

如果您知道CreateObject 在编译时将返回的连接数(即NUMBER_OF_CONNECTIONS 是编译时常量),您可以使用std::array&lt; Ptr&lt; ConnectionType &gt;, NUMBER_OF_CONNECTIONS &gt;std::array 模拟一个最接近标准容器的原始数组,并且在编写现代 C++ 时更喜欢原始数组。如果NUMBER_OF_CONNECTIONS 的大小在运行时确定,您可以使用std::vector&lt; Ptr&lt; ConnectionType &gt; &gt;。所以改为任一

#include <array>
...
std::array< Ptr< ConnectionType >, NUMBER_OF_CONNECTIONS > ConnectionArray{ CreateObject< ConnectionType >() };

#include <vector>
...
std::vector< Ptr< ConnectionType > > ConnectionArray{ CreateObject< ConnectionType >() };

此外,如果您还不知道,C++11 增加了对三种标准智能指针的支持:unique_ptrshared_ptrweak_ptr(它们的所有权语义不同),您可能更喜欢如果它们满足您的需求并且您能够使用实现它们的编译器,则可以使用您自己的自制智能指针。

【讨论】:

  • 谢谢,但是当我使用数组时,它会给出一个错误,它需要一个';'在 std::array 中的 ConnectionArray 之后,NUMBER_OF_CONNECTIONS > ConnectionArray{ CreateObject() };
  • @Fouda 用标准智能指针替换您的 Ptr 类,存根 ConnectionType 类并更改初始化语法,以下代码编译干净:ideone.com/eOFc0K
  • +1 这个解决方案对我有用。只是想添加到此解决方案中以供将来参考。 ' Ptr ConnectionArray[NUMBER_OF_CONNECTIONS] = CreateObject (); ' 对于 5 或​​更低版本的 gcc 运行良好。对于更高的 gcc 版本(这显然是推荐的方法),@bpw1621 给出的解决方案效果很好。
猜你喜欢
  • 2020-02-03
  • 2012-09-06
  • 2016-04-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多