4

現在、プロジェクトでコーディングしており、次のような関数があります。

Room::addItem(Item*&); //not written by me

パラメータとして送信するものを理解するのに問題があります..「*&」が台無しです。

私は次のことを試しました:

foo.addItem(loadItem());         //Returns an Item-object
/*and*/
foo.addItem(loadItem());         //Returns an Item-pointer

編集:「*&」の意味を説明していただければ幸いです。次に出くわしたら理解したいです;)

4

4 に答える 4

2

あなたの関数はポインタへの参照を期待しているようです。たとえば、MSDN には、同様の構文のサンプル コードがいくつかあります。

// Add2: Add a node to the binary tree.
//       Uses reference to pointer
int Add2( BTree*& Root, char *szToAdd ) {
   if ( Root == 0 ) {
...

そうしたい理由はさまざまですが、お気に入りの検索エンジンが役立つはずです。正しい方向性を示す 1 つのブログ エントリは、こちらです。

于 2012-11-21T13:14:57.520 に答える
2

addItem関数は型の引数を受け入れ、Item*ポインターは参照によって渡されます。これは、関数addItemがポインターを内部的に変更できることを意味します。これは、オブジェクトがこの関数内で再割り当てまたは変更されていることを意味する場合もあります。

例:

void pointerByValue(int* ptr)
{
   ptr = new int[10];
}


void pointerByReference(int*& ptr)
{
  ptr = new int[10];
}

void main()
{
   int* p = NULL; //A NULL pointer

   pointerByValue(p); //p is still NULL

   pointerByReference(p); //memory has now been allocated to p
}

Pointer By Reference は C++ でのみ有効です。

于 2012-11-21T13:13:58.443 に答える
1

パラメーターの型は へのポインターへの参照でありItem、それに渡す必要があるのは へのポインターItem(つまり Item*) であり、さらに左辺値である必要があります (おそらく Room::addItemがポインターを変更するため)。

于 2012-11-21T13:15:28.890 に答える
1

関数へのポインタを渡す必要があります

Item item = loadItem()
foo.addItem(&item);

& は、関数が参照を使用し、その値を変更できることを意味します

于 2012-11-21T13:17:31.290 に答える