2016-12-04 74 views
0

我是新鮮的C++和嘗試不同的東西與功能。我剛遇到一個問題,或者說是一個反思。想象一下吧;我們有一個功能:發送只有一個整數到一個函數,需要兩個整數

void test(int one, int two) { 

if(one == 5) { 
    cout << "one is 5" << endl; 
} 
if(two == 10) { 
    cout << "two is 10" << endl; 
} 
if(one == 1 && two == 2) { 
    cout << "they both are 1 and 2" << endl; 
} 

} 

然後到這裏,我們有我們的主要功能,我們稱之爲測試:在某些情況下,只是想叫test(1) 測試(1,8),這是很好的,但如果我?如果我不想給這個函數提供兩個整數,因爲我希望它只爲int one做什麼?我想通過簡單地做test(1,NULL)test(NULL,10)有一個解決方法,但這是醜陋的權利?

必須有辦法,我知道我的例子很糟糕,但我希望你明白我的觀點。

+2

[函數重載](https://en.wikipedia.org/wiki/Function_overloading) – Drop

+0

您可以爲函數寫入一個重載,該函數接受一個參數。查找函數重載。 – DeiDei

+0

@Drop感謝您的幫助! –

回答

3

一種方式是提供一個默認的參數,第二個:

void test(int one, int two = 0) 

然後,如果你只用一個參數調用它那麼第二個參數假定的默認值。

另一種方法是重載函數:

void test(int one) 

這樣做,你可以寫具體的行爲,當一個單一的參數傳遞時的優勢。

+0

這並沒有真正區分是否給出了第二個參數的值。 –

+0

是的,這個答案是不完整的。 – Bathsheba

-1

你不能。您必須爲函數所具有的每個參數提供參數。如果存在默認參數,您可能不需要明確地這樣做,但仍然爲該參數提供參數。

0

如果需要局部評價,看std::bind

#include <iostream> 
#include <functional> 

using namespace std::placeholders; 

int adder(int a, int b) { 
    return a + b; 
} 

int main() { 
    auto add_to_1 = std::bind(adder, 1, _1); 

    auto add_1_to = std::bind(adder, _1, 1); 

    std::cout << add_1_to(2) << std::endl; 

    std::cout << add_to_1(2) << std::endl; 

    return 0; 
} 
+0

在問題中我沒有看到任何證據表明這是所謂的。 –

+0

「..如果我在某些情況下只是想打電話測試(1),「對我來說是一個很好的指示。」 –

+0

_「因爲我希望它只做一個int的東西」_你必須閱讀整個問題,而不是隻是其中的一部分:) –

0

有2個選項:

void test(int one, int two = -1) { 
    /* ... */ 
} 

這給功能兩種因此調用測試的默認值(2)將意味着測試函數將以1 = 2和2 = -1運行。如果在函數定義中沒有默認參數後沒有變量,則這些缺省值只能起作用。

void testA(int one, int two = -1); // OK 
void testB(int one, int two = -1, int three); // ERROR 
void testC(int one, int two = -1, int three = -1); // OK 

然後另一種選擇是重載此功能。重載意味着一個函數有兩個不同的定義。在重載函數時有一些規則可以遵循,主要是不同的重載必須通過您提供的參數來區分。所以在你的情況下,解決方案將是:

void test(int one) { 
    /* ... */ 
} 
void test(int one, int two) { 
    /* ... */ 
} 

如果您有任何問題隨時問。

相關問題