【问题标题】:C++ working with smart pointersC++ 使用智能指针
【发布时间】:2012-07-05 15:21:38
【问题描述】:

在我的代码中,我有函数原型

void AddBenchNode(ref_ptr<Group> root ,ref_ptr<Node> benches, bool setAttitude = false, float scale_x =.15, float scale_y =15, float scale_z = 15, int position_x = 250, int position_y = 100, int position_z =0 );

其中 ref_ptr 是一个智能指针。

在我的主函数中,我定义了 2 个 ref_ptr 和 ref_ptr 类型的智能指针,并将它们传递给对我的函数 AddBenchNode 的调用。

ref_ptr<Group> root = new Group();
ref_ptr<Node> benches = readNodeFile("Models/test.ive");
AddBenchNode(root, benches, true);

当调用执行时,什么也没有发生。因为没有对根指针进行任何更改。我想知道的是我是否正确地拨打了这个电话?或者我是否必须重新定义我的函数以获取指向这些智能指针的指针?

现在我确实尝试通过引用传递

void AddBenchNode(osg::ref_ptr<osg::Group>& root ,osg::ref_ptr<osg::Node>& benches, bool setAttitude = false, float scale_x =.15, float scale_y =15, float scale_z = 15, int position_x = 250, int position_y = 100, int position_z =0 );

这导致了一些链接器错误。

错误 2 错误 LNK2001:无法解析的外部符号“void __cdecl AddBenchNode(class osg::ref_ptr &,class osg::ref_ptr &,bool,float,float,float,int,int,int)" (? AddBenchNode@@YAXAAV?$ref_ptr@VGroup@osg@@@osg@@AAV?$ref_ptr@VNode@osg@@@2@_NMMMHHH@Z) 错误 3 error LNK1120: 1 unresolved externals

【问题讨论】:

  • 函数内部发生了什么?
  • 鉴于ref_ptr 似乎不是标准C++ 库的一部分,也许您可​​以告诉我们您使用的是哪个库?如果您可以提供一个简单的、独立的示例,该示例将编译并运行以展示您所看到的问题,这也将非常有帮助。
  • 您为什么希望root 指针发生变化?它看起来更像是应该对它指向的Group 做一些事情,而不是指针本身。 (但如果它应该改变它的参数,那么它需要通过引用或指针来获取那个参数,正如你所说的)。
  • OpensceneGraph 库。好吧,应该对作为参数传入函数 AddBenchNode() 的两个指针进行更改-

标签: c++ smart-pointers


【解决方案1】:

您正在按值传递(智能)指针。这意味着调用者和被调用者将共享同一个对象,但具有单独的指针副本。函数对对象所做的更改将对调用者可见。但是如果函数创建一个指向一个全新对象的指针,它不会影响调用者的指针,它仍然指向旧对象。

如果要重新绑定调用者的指针,需要通过指针或引用来传递指针。

【讨论】:

  • 当我尝试参考方法时,我遇到了一些链接器错误。请参阅上面的更新。
  • @user272671:您是否同时更改了原型和实际定义?它们必须匹配。
  • 这就是问题所在。谢谢
【解决方案2】:

看起来您正确使用了智能指针,但很难说错误在哪里,因为我们不知道 ref_ptr 是什么或 AddBenchNode 做什么。

ref_ptropenscenegraph 吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2014-11-22
    • 2011-08-12
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多