2012-11-21 87 views
4

我目前編碼一個項目,我有一個看起來像這樣的功能:C++什麼參數的麻煩送

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

我有一些很難理解派作爲參數。其中「* 「爲我搞砸了。

我已經試過如下:

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

編輯:如果您解釋一下什麼是「* &」表示這將是很好。我想了解它,下一次我碰到它;)

+1

'*'是一個指針引用一個'項目',你應該傳遞一個對'Item'對象的引用,即'&itemObject'。 – Maroun

+0

我的猜測是這是一個寫得不好的代碼,addItem可能不會修改那個指針。 –

回答

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 
} 

指針通過引用只在C++有效。

+1

另外,因爲參考是一個非const,指針必須是一個左值---它不可能是一個函數的返回值,例如(除非該函數返回一個'項目*&')。 –

+0

聽起來不錯,但爲什麼不接受我發給它的指針? 在短碼的功能看起來像這樣,當它發送指針: 項目* loadItem([參數]){ 項目TMP =新項目([paramters]); return &tmp; } –

2

它在我看來像你的函數期望對指針的引用。例如,MSDN有一些類似語法的sample code

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

有爲什麼您可能想這樣做種種原因,但你喜歡的搜索引擎應該能夠幫助你。一個博客文章向您指出正確的方向是here

1

參數類型的指針引用到Item,並 你需要傳遞給它的是一個指向Item(即 Item*),它必須,此外,是一個左值(因爲那時, Room::addItem將要修改指針)。

1

你需要傳遞函數指針

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

&意味着函數將使用參考,並能夠改變它的價值