2012-07-05 152 views
0

在我的代码的工作,我有函数原型C++智能指针

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:解析外部符号 “空隙__cdecl AddBenchNode(类OSG :: ref_ptr &,类OSG :: ref_ptr &,布尔,浮动,浮动,浮动,INT,INT,INT)”(AddBenchNode? ?@@ YAXAAV $ @ ref_ptr @ VGroup OSG @@@ OSG @@ AAV $ @ ref_ptr @ v节点OSG @@@ 2 @ _NMMMHHH @ Z) 错误3错误LNK1120:1周无法解析的外部

+0

函数内部会发生什么? – tmpearce 2012-07-05 15:24:34

+2

考虑到ref_ptr似乎不是标准C++库的一部分,也许你会告诉我们你正在使用哪个库?如果您可以提供一个简单的,自包含的示例,它将编译并运行以展示您所看到的问题,这也非常有帮助。 – Rook 2012-07-05 15:24:47

+0

你为什么期望'root'指针改变?它看起来更像是应该对它指向的“Group”做些什么,而不是指针本身。 (但是如果它应该改变它的参数,那么它将需要通过引用或指针来引用该参数,正如你所说的那样)。 – 2012-07-05 15:28:40

回答

1

您正在按值传递(智能)指针。这意味着调用者和被调用者将共享相同的对象,但分别具有指针的副本。调用者可以看到函数对该对象的更改。但是,如果该函数产生一个指向全新对象的指针,它不会影响调用者的指针,该指针仍指向旧对象。

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

+0

当我尝试引用方法时,遇到了一些链接器错误。见上面的更新。 – user272671 2012-07-05 15:30:40

+0

@ user272671:你是否改变了原型和实际定义?他们必须匹配。 – 2012-07-05 15:46:23

+0

这是问题所在。谢谢 – user272671 2012-07-05 16:08:57

0

它看起来像您正确使用智能指针,但很难说错误的位置,因为我们不知道ref_ptr是什么或AddBenchNode

ref_ptropenscenegraph

+0

是的,它来自OSG – user272671 2012-07-05 15:30:20