2012-07-05 148 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