2015-05-30 56 views
-3

我有這樣的事情。爲什麼lastItem未定義?返回指針undefined即使它應該是

Menu* CreateItem() 
{ 
    Menu* menuPointer = new Menu; 
    //initialize values  
    return menuPointer; 
} 

void AnotherFunction() 
{ 
    Menu* lastItem = CreateItem(); 
} 

非常感謝!

編輯:

我想通了,但我真的不明白爲什麼這是行不通的。更完整的背景下看起來像這樣

Menu* Content::CreateItem() 
{ 
    Menu* menuPointer = new Menu; 
    //initialize values  
    return menuPointer; 
} 

void Content::CreateObject(Menu* curItem, Menu* lastItem) 
{ 
    lastItem = CreateItem(); 
    curItem = lastItem; 
} 

void Content::Initialize() 
{ 
    Menu* curItem = 0; 
    Menu* lastItem = 0; 
while (...) 
{ 
    if (/*object is complete*/) 
    { 
     CreateObject(curItem, lastItem); 
    } 
    //create object little by little 
} 

}

我改變

Menu* curItem = 0; 
Menu* lastItem = 0; 

Menu* curItem = new Menu; 
Menu* lastItem = new Menu; 

爲什麼這個必要嗎?

+1

這是什麼語言? –

+0

語言是C++ – InSaNo

回答

0

你的問題是,將參數傳遞給在C++中默認的功能由值爲。

這樣做的結果是,對參數值的更改對於函數是局部的。

因此,鑑於你編輯的代碼

Menu* Content::CreateItem() 
{ 
    Menu* menuPointer = new Menu; 
    //initialize values  
    return menuPointer; 
} 

void Content::CreateObject(Menu* curItem, Menu* lastItem) 
{ 
    lastItem = CreateItem(); 
    curItem = lastItem; 
} 

CreateItem()功能正常。 menuPointer的值返回給調用者。

但是,curItemCreateObject()的變化是不同的。來電者,做

Content::CreateObject(someItem, someOtherItem); 

時通過的someItemsomeOtherItem值的副本。功能內的更改會更改副本的值,而不是主叫方看到的變量someItemsomeOtherItem

一種可能的解決方案是將指針傳遞給指針。

void Content::CreateObject(Menu **curItem, Menu **lastItem) 
{ 
    *lastItem = CreateItem(); 
    *curItem = *lastItem; 
} 

注意上面的附加星號。這個原因的原因是,雖然指針的值的變化對調用者不可見,但指針指向(指向對象,如果你喜歡)的變化對調用者是可見的。

另一個解決方案,就像您在自己的自我回復中已經提到的那樣,是將引用傳遞給指針。

void Content::CreateObject(Menu *&curItem, Menu *&lastItem) 
{ 
    lastItem = CreateItem(); 
    curItem = lastItem; 
} 

您需要閱讀教科書更好,因爲C所有基本教材++形容這在這種或那種方式。

+0

非常感謝您的回答!這種行爲對我來說很熟悉,我只是不記得它也適用於指針。 – InSaNo

0

其實,我所做的事情似乎只是工作。最後,我需要做的就是改變這種

void Content::CreateObject(Menu* curItem, Menu* lastItem); 

void Content::CreateObject(Menu*& curItem, Menu*& lastItem);