2013-05-17 7 views
0

「指針」保存「Int」的地址。我想通過參照地址傳遞給我的給類:將地址傳遞給一個類,並從那裏通過C++中的引用向其「子級」

class N { 
public: 
    N(int &pPointer){ 
     std::cout << "Address: " << &(pPointer) <<" \n"; 
    } 
}; 
class M { 
public: 
    M(int &pPointer):n(pPointer) {    
     std::cout << "Address: " << &pPointer <<" \n"; 
    } 
    private: 
    N n; 
}; 

int main() { 
    int Int = 5; 
    int *pointer = &Int;  
    std::cout << "Address: " << pointer <<" \n"; 
    M m(*pointer); 
    return 0; 
} 

這是一個很好的做法(因爲我是一種使用參照復引用指針)? 還是絕對可怕? 我只是想在這裏避免指針。 (儘管我在開始時被迫使用「*指針」)。

+1

爲什麼你不得不在開始時使用'*指針'?爲什麼不使用'M m(Int);'? –

+0

好問題!在我的項目中,我想將「全局」屏幕傳遞給一些渲染函數。屏幕必須是指向SDL_Surface的指針,因爲初始函數SDL_SetVideoMode返回指向SDL_Surface的指針。看到這裏:http://www.libsdl.org/docs/html/sdlsetvideomode.html – user1511417

回答

0

如果您必須確定,但可以考慮在函數參數中使用常量參考N(const int& pPointer)。這意味着你不能改變指針指向別的東西,但你仍然可以通過解引用來修改底層變量值。

如果您將引用作爲數據成員存儲在類中,請注意。如果調用者中的對象(在你的情況下是一個int)超出範圍,你最終可能會得到一個'懸掛引用'。

+0

這對我來說沒有意義:一個引用總是const,因爲它只能「引用」一次。 (而指針可以在運行時指向不同的東西。)而且我希望「pPointer」能夠改變「Int」。 – user1511417

+0

不完全。如果引用是一個對象(而不是POD),則不能在該對象上調用非const函數或修改其成員數據。對於POD,您不能修改參考:例如int k = 8; const int&l = k; l = 9;無效,但int k = 8; int&l = k; l = 9;很好。 – Bathsheba

+0

但正如我所說:我想在類N中的pPointer(在您的示例中爲「l」)能夠更改「Int」(在您的示例「k」中)。 – user1511417

1

完全可以通過引用來傳遞,而不是通過指針傳遞來稍後使用該對象,因爲您知道您正在使用的指針是有效的。這允許您跳過nullptr檢查,因爲引用不能爲空。
但是,如果存儲引用,則無法將引用的對象替換爲另一個引用。但你可以用指針來做到這一點。
稍後,您可以獲取所引用對象的地址,但是您真的認爲您需要需要來做到這一點嗎?因爲你可以使用參考代替

相關問題