2013-08-21 47 views
2

我認爲,當一個函數(a)在另一個函數(b)內被調用時,有一種常見的情況,而'a'有一些默認參數,'b'是需要的支持他們。例如:語言設計:默認方法參數繼承

void a(int v1, int v2=0, int v3=1); 
void b(int m1, int m2, int v1, int v2=0, int v3=1) { 
    // ... 
    a(v1, v2, v3); 
    // ... 
} 

但這是違反DRY原則的。它可以導致一個微妙的錯誤,當默認參數「A」改變了,但在「B」沒有改變:

void a(int v1, int v2, int v3=0); 
void b(int m1, int m2, int v1, int v2=0, int v3=1) { 
    // ... 
    a(v1, v2, v3); 
    // ... 
} 

爲什麼在C++繼承默認參數值的機制?它可能看起來像:

void a(int v1, int v2=0, int v3=1); 
void b(int m1, int m2, int v1, int v2=default(a::v2, 0), int v3=default(a::v3, 1)) { 
    // ... 
    a(v1, v2, v3); 
    // ... 
} 

是否有語言,有這樣的語法?

它可能是這個主板上的一個offtopic?

+0

這不會真的成爲話題在這裏,不。我們更傾向於實際的「這個代碼不起作用」的問題。您的問題*可能會在Programmers.SE上正常,但我無法確定。 *主題*絕對適合他們。 –

+4

我刪除了C標籤,因爲C沒有默認參數。 –

+1

在C++中,你可以通過重載'b'(帶有3,4和5個參數)來解決這個問題。如果您不想自己編寫重載,則可以使用可變參數模板/參數包。或者,您可以使用'boost :: optional'作爲參數(對於'b')*使用默認參數*。 – dyp

回答

5

該問題實際上是使用幻數。如果您刪除了幻數,問題就很好地解決了。

enum DefaultA { DefaultA_v2 = 0, DefaultA_v3 = 1 }; 

void a(int v1, int v2=DefaultA_v2, int v3=DefaultA_v3); 

void b(int m1, int m2, int v1, int v2=DefaultA_v2, int v3=DefaultA_v3) { 
    // ... 
    a(v1, v2, v3); 
    // ... 
} 
+0

再次,另一層間接解決了這個問題。 – chris

0

「但是,這是違反了DRY原則,它可以導致一個微妙的錯誤,當默認參數‘A’改變了,但在‘B’沒有改變」

坦率地說,我如果你得到這個「bug」,那麼你的功能就太緊密了。獨立功能應該是獨立的。如果更改一個函數的默認參數會導致另一個函數中斷,那麼我認爲您在那裏有一個設計問題。