【问题标题】:Learning to use Boost Shared Pointers, Console Output Correct?学习使用 Boost 共享指针,控制台输出正确吗?
【发布时间】:2012-10-05 05:05:32
【问题描述】:

我有几个类:Array、Shape、Point。点是一种形状。

我创建了一个 ShapePtr 数组,并为第一个元素分配了一个点。当我打印数组的第一个元素时,它只显示一个奇怪的数字(我想是内存位置?)。这是正常的吗?有没有办法打印分配给该位置的点?还是Point已经被摧毁了?我的主要是这样的:

{   

// Typedef for a shared pointer to shape
typedef boost::shared_ptr<Shape> ShapePtr;

// a typedef for an array with shapes stored as shared pointers.
typedef Array<ShapePtr> ShapeArray;

ShapeArray my_ShapeArray;

ShapePtr my_Point (new Point(3.1459));

my_ShapeArray[0] = my_Point;

cout  << my_ShapeArray[0] << endl;

return 0;

}

输出是(我有一些用于构造函数和析构函数的 cmets):

数组构造函数调用(默认)

形状构造函数调用(默认)

点构造函数调用(默认)

002DDA20

点析构函数调用

形状析构函数调用

数组析构函数调用

我有点困惑,因为似乎在我打印点之后调用了析构函数,但不是打印点,它似乎只是打印内存地址。你能帮我理解吗?谢谢!

【问题讨论】:

  • 尝试解引用运算符**(my_ShapeArray[0])
  • 在这种情况下也更喜欢使用“make_shared”。即“ShapePtr my_Point = boost::make_shared( 3.1459 )”,因为它可以提高内存效率。 (假设 Point 派生自 Shape)

标签: c++ arrays pointers boost shared-ptr


【解决方案1】:

指针(大致)是一个内存位置,因此当您打印指针时,这就是您所得到的。如果您希望该对象位于该内存位置,则可以通过在前面放置一个星号来取消引用它:

cout  << *my_ShapeArray[0] << endl;

【讨论】:

  • 当我尝试时:cout &lt;&lt; *my_ShapeArray[0] &lt;&lt; endl; 我得到一个编译器错误:> 错误 C2679: 二进制 '
  • @Clark 这意味着你必须为你的Shape 类提供一个ostream&amp; operator&lt;&lt;
  • 中间有几个步骤。 1) 不知何故,共享指针看起来像一个指针,2) 有一个 ostream operator&lt;&lt; 重载用于打印其地址的指针。
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多