2010-10-14 88 views
0

你可以給我一個例子,當我不能通過引用傳遞參數,我需要使用指針。我找到了一個例子,但我不確定。當我需要通過指針傳遞(而不是通過引用)

假設您有一個來自基類B的類D。如果你想這樣做,你需要有一個指針:

void function(B* b){...} 
int main{ 
    D* d; 
    function(d); 
} 
+1

您可以在示例中使用參考。 – JoshD 2010-10-14 21:02:04

+1

我剛纔問同樣的問題http://stackoverflow.com/questions/3835741/are-reference-and-pointer-equal-with-regards-to-polymorphism – pm100 2010-10-14 21:03:54

回答

6

單時,你不能使用參考,並必須使用指針,如果你允許「不爭論」的概念,通過傳遞一個空指針。

但是,當您實際存儲指向任何傳遞的指針時,您可能希望使用指針作爲參數。大多數C++開發人員都會注意到你沒有使用引用,並且特別注意你的文檔所說的內容。

+0

有人可能會爭辯說,你甚至不需要*需要*一個指針,如果你寫一個具有可空狀態的對象。但無論如何。 – 2010-10-14 21:40:42

+0

是的,但並非所有的對象都是可空的,特別是當你使用RAII時:-) – 2010-10-14 23:16:52

+0

@John Dibling:我不是Nullable概念的粉絲(至少內置),我更喜歡'boost :: optional '鉤子,以便按類型區分什麼可以和不能爲空。 – 2010-10-15 07:10:29

-1

唯一的原因是如果你需要傳遞null。也就是說,你想調用這個函數說'我還沒有其中一個'

6

如果有一個編碼指南(如谷歌的)說使用指針參數,那麼這就是你所做的。

否則,只能用指針形參聲明自己的功能時

  • 一個空指針是一個有效的&有意義的實際參數,或

  • 實際參數是最自然的指針已經或

  • 你打算將指針存儲在某處。

可能更多的情況,但我認爲你漂移:當你有一個選擇(無編碼準則另有說法),喜歡引用。

乾杯&心連心,

+0

+1表示「實際參數最自然的指針已經是」。一個明顯的例子是,一旦你談論迭代,你關心的就是你在序列中的位置,即你正在看的序列中的對象。例如。 http://stackoverflow.com/questions/3909784/how-do-i-find-a-particular-value-in-an-array-and-return-its-index/3909788#3909788。 – Brian 2010-10-14 21:08:58

+3

當然,不要使用Google的。這很傻。 – GManNickG 2010-10-14 21:51:42

0

如果你想允許缺乏一個對象,你需要使用指針:

// This allows DoSomething to receive pointers to NULL, which cannot 
// be done with references 
void DoSomething(Something *pSomething) 
{ 
    if (pSomething) 
    { 
    ... 
    } 
} 

int main() 
{ 
    Something *pSomething=NULL; 

    DoSomething(pSomething); 
} 
+1

而不是一個函數長的if語句,請考慮if(!pSomething){return; }頂部:) – 2010-10-15 07:12:10

+0

@Matthieu:但是然後該函數將有多個退出! ....:P – GManNickG 2010-10-15 21:38:23

-2

我認爲如果你想傳遞一個函數,你必須通過指針傳遞它。我不明白你如何通過引用來傳遞函數。

例如,採取以下功能:

#include <iostream> 
#include "math.h" 

void myfun (double value, size_t nofloops, double (*function)(double)) 
    { 
    std::cout << value << std::endl; 
    for (size_t i=0;i<nofloops;++i) 
     { 
     value = function(value); 
     std::cout << value << std::endl; 
     } 
    std::cout << "------------------" << std::endl; 
    } 

void main() 
    { 
    myfun(100,10,sin); 
    myfun(100,10,cos); 
    myfun(100,10,sqrt); 
    } 

在這個小效用函數執行給定的功能的次數,取該結果作爲下一次迭代的輸入。我看不出你如何通過引用來傳遞函數。

+1

-1 for'void main',在C和C++中都是無效的(並且在任何一種語言中都是無效的).Re傳遞引用:只需用'(* function) &功能)'。而已。 :-)乾杯&hth。, – 2010-10-15 05:10:15

+0

PS:當你通過引用傳遞一個函數時,你會得到一個非常奇怪的野獸(這可能是你認爲它無法完成的原因),一個*只讀引用*。它不是對const的引用,但是你不能指定它。因爲你不能分配給一個函數,並且當你把一個引用看作一個別名,另一個名字,那麼這是有道理的。 – 2010-10-15 05:15:18

+0

顯然,一些較早的C編譯器允許「void main」。請參閱http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/legality-of-void-main.html。 – Patrick 2010-10-15 07:01:49

1

另一種情況:如果你傳遞的東西是可變參數之前的最後一個參數:

void fn1(A &a, ...); // Uh oh 
void fn2(A *a, ...); // Good 

如果這是標準所要求的,我不知道,或者僅僅是在執行中的錯誤我使用的C++編譯器。

+0

該標準只說變量參數必須是最後一個參數,或者可能必須有一個前面的參數。該參數的類型絕對沒有提及。 – Puppy 2010-10-15 21:50:29

+0

在聲明或定義一個函數方面,不需要'...'之前的POD類型,但需要使用'va_start()'返回有用的參數。 18.7p3:「如果使用函數,數組或引用類型聲明[va_start]參數,或者使用與傳遞沒有參數的參數傳遞的類型不兼容的類型,行爲是不確定的。「 – aschepler 2010-10-15 22:03:54

+0

此外,在這種情況下,我建議創建一個從'class A'到一個包含'A *'指針的POD結構的隱式轉換,並將其作爲最後一個命名參數,以便用戶可以調用該函數第一個參數類型實際上是'A'(或相關的參考)。 – aschepler 2010-10-15 22:06:54

1

通常,使用指針的兩兩件事之一:

  • Reassignability - 你不能重新綁定一個 參考。
  • 空指針 - 沒有這樣的 事情作爲空引用。

如果您的預期用例不需要這兩個屬性中的任何一個,請使用引用。否則,使用指針。