2012-05-25 50 views
-1

什麼後果成員項目傳遞不必要的成員函數(除貧窮代碼等):C++傳遞一個類成員項目成員函數

struct foobar 
{ 
    char * arr; //properly initialized to SIZE at some point 
} 

class foo 
{ 
    public: 
    void bar(foobar&); 
    foobar barfoo; 
}; 


void foo::bar(foobar& barf) 
{ 
    cin.get(barf.arr, SIZE, '\n'); 
    cin.ignore(100, '\n'); 
} 

有什麼理由不直接刪除bar中的參數並直接撥打barfoo?如果有的話,不這樣做的後果是什麼?

+1

你怎麼稱呼foo :: bar()?你不能從課外訪問私人成員。 – betabandido

+2

語義不同,也不是「錯」。 – ildjarn

+0

假設它的所有公共或使用get_foobar函數返回一個結構 – Flexo1515

回答

1

傳遞參數會帶來輕微的開銷,所以如果你永遠不會用另一個成員調用該方法,那麼你可以擺脫參數。如果您將來可能需要做這樣的事情:

class foo 
{ 
    public: 
    void bar(foobar&); 

    private/*(or still public)*/: 
    foobar barfoo; 
    foobar barfoo2; 

    void some_other_method() { 
     //do stuff 
     bar(barfoo); 
     bar(barfoo2); 
}; 

然後我會放棄它。

3

這取決於。

如果foo::bar被調用的唯一上下文是當this->barfoo作爲參數傳遞時,那麼它非常愚蠢(儘管不是明顯有害的)。

但是在this->barfoo不是唯一可以傳遞給成員函數的參數的情況下,顯然沒關係。

+0

我意識到我已經將client_item傳遞給客戶端類中的每個函數,並且除了客戶端項之外沒有實際使用任何其他項,所以在那種情況下,我可以消除該參數? – Flexo1515

1

沒有理由不消除它。當你在函數中傳遞它時,至少你會做一個額外的解引用。

但是,如果somethign是用吧,從你的類以外(取得foobar &),你可以重載它,做這樣的事情:

class foo { 
public: 
    void bar(); /* Uses default barfoo */ 
    void bar(foobar&); 
    foobar barfoo; 
private: 
}; 

viod foo:bar() { 
    bar(barfoo); 
} 

void foo::bar(foobar& barf) { 
    cin.get(barf.arr, SIZE, '\n'); 
    cin.ignore(100, '\n'); 
} 
2

一個後果是foobar的的其他情況不能傳遞給相同的方法。

問題不在於某個成員是否有時被髮送到某個方法,而是該呼叫者是否希望能夠指定該參數。

由於這是一種公開方法,因此可能會有除此類外的其他呼叫者。