0

私のコードには、関数プロトタイプがあります

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はスマートポインターです。

私のメイン関数では、タイプref_ptrとref_ptrの2つのスマートポインターを定義し、それらを関数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エラーLNK1120:1未解決の外部

4

2 に答える 2

1

(スマート)ポインターを値で渡しています。つまり、呼び出し元と呼び出し先は同じオブジェクトを共有しますが、ポインターのコピーは別々になります。関数がオブジェクトに加える変更は、呼び出し元に表示されます。ただし、関数が新しいオブジェクトへのポインターを作成した場合、呼び出し元のポインターは影響を受けず、古いオブジェクトを指し続けます。

呼び出し元のポインターを再バインドする場合は、ポインターまたは参照によってポインターを渡す必要があります。

于 2012-07-05T15:24:57.880 に答える
0

スマート ポインターを正しく使用しているように見えますが、バグがどこにあるのかを特定するのは困難ref_ptrですAddBenchNode

openscenegraphref_ptrからですか?

于 2012-07-05T15:24:44.810 に答える