2014-02-07 55 views
3

所以在我的主函數中,我有一個調用函數,參數存儲在一個變量中。我運行我的程序,並執行包含該函數的變量。我認爲,當我將函數或任何東西存儲在一個變量中時,它就不應該執行,直到我告訴它爲止。C++變量和函數

例如:

int cycle1 = cycleList(argument1, argument2); 

上面這個說法現在我的屏幕上執行。這是寫代碼的正確方法嗎?我想將函數存儲在變量中,稍後在我的代碼中使用該變量。

+0

_'I想某處存儲在一個變量的函數,並在以後使用的變量在我的代碼.'_你有沒有這意味着我想將**函數結果**存儲在一個變量中,並稍後在代碼中的某處使用該變量。'然後是的,這是正確的。 –

+0

聽起來像你正在尋找類似於lambda或functor的東西。 – jerry

+0

非常感謝你們!是的,我試圖將函數的結果存儲到變量中。當我瞭解基礎知識時,我會回顧一下如何存儲函數而不是結果,但感謝您仍然回答並覆蓋我的問題的所有可能性。 – user3029001

回答

0

如果你想存儲一個函數,你需要製作一個函數指針,而不是調用函數,這就是你正在做的。試試這個:

#include <functional> 

std::function<int (int, int)> cycle1 = cycleList; 

或者,如果你沒有進入C++ 11,試試這個:

int (*cycle1)(int, int) = cycleList; 

後來的後來,你可以撥打:

cycle1(argument1, argument2); 
0

在C++,變量存儲值,而不是函數;並且調用函數來獲取值的表達式立即執行。因此,您的示例調用該函數獲取int值,然後將該值存儲在該變量中。

有辦法做你想要什麼:

// Store a lambda function object, capturing arguments to call it with. 
// This doesn't call the function. 
auto cycle1 = [=]{cycleList(argument1, argument2);}; 

// Call the function later. This calles 'cycleList' with the captured arguments. 
int result = cycle1(); 

,但你應該做這樣的事情之前,可能學習的基礎知識。

0

函數返回結果,並且功能對象可以存儲(和周圍複製)自身,包括它們的參數

#include <iostream> 

int cycleList(int arg1, int arg2) { return arg1 + arg2; } 

struct cycleListObj 
{ 
    int arg1, arg2; 

    // constructor stores arguments for later use 
    cycleListObj(int a1, int a2): arg1(a1), arg2(a2) {} 

    // overload function call operator() 
    int operator()() { return arg1 + arg2; } 
}; 

int main() 
{ 
    int result1 = cycleList(1, 1); // stores 2 into result1 
    cycleListObj fun(1, 1);   // defines a function object fun with arguments 1, 1 
    int result2 = fun();    // calls the function object, and stores the result into result2 
    std::cout << result1 << result2; // outputs 22 
} 

Live Example

如其他人已經表明,在C++標準庫定義其自己的通用功能對象std::function,但對於許多目的,您也可以自己定義它們。

您也可以存儲函數指針,但是您仍然必須在調用站點處提供參數。使用函數對象,您可以先存儲參數,然後再調用它。

0

函數可以接受參數並可以返回結果。在程序中聲明函數的地方並不重要,只要函數名稱在編譯器調用之前就已知。

讓我們來看一個例子;

int Add(int num1, int num2) 
    { 
     return num1 + num2; 
    } 

    int main() 
    { 
     int result, input1, input2; 

     cout << "Give a integer number:"; 
     cin >> input1; 
     cout << "Give another integer number:"; 
     cin >> input2; 

     result = Add(input1,input2); 

     cout << input1 << " + " << input2 << " = " << answer; 
     return 0; 
    } 

這裏我在main()之前定義了Add()函數,所以main知道定義了Add()。所以在main()中,當add()調用它發送兩個參數並獲得返回num1 + num2的結果時。然後它返回結果的值。

1

如果您想在該時間點將程序的運行結果存儲在程序的運行時間中,那麼是的,您正在做的是正確的。

0

至於我可以從查詢得到的是,你在呼喚你的類參數化的方法,該方法是將一些價值。您想要將該方法的結果存儲在變量中,以便您可以根據需要使用它。但是,即使您不需要它,您也希望消除計算該方法的開銷。只有在您需要或基於特定條件時才應執行。

我可以建議你在這種情況下,有一個條件這段代碼。當您希望該方法執行並計算結果時,必須有適當的時間或滿意的條件。 例如:

public class BaseCondition { 
    public int compute(int a, int b) { 
     return (a + b); 
    } 

    public boolean set(boolean flag) { 
     flag = true; 
     return flag; 
    } 

    public int subtract(int a, int b) { 
     return (a - b); 
    } 

    public int callCompute(int a, int b) { 
     boolean flag = false; 
     int computedVal = 0; 
     if (a < b || a == b) { 
      flag = set(flag); 
     } 
     if (flag) { 
      computedVal = compute(a, b); 
     } else { 
      computedVal = subtract(a, b); 
     } 

     return computedVal; 
    } 

    public static void main(String[] args) { 
     BaseCondition obj = new BaseCondition(); 
     int a = 11; 
     int b = 51; 
     System.out.println("Result=" + obj.callCompute(a, b)); 

    } 

} 

在這裏,你可以找到計算將僅被設定只有當條件滿足標誌的基礎上進行調用。 希望它能幫助:)

+0

我已經爲你的問題寫了一個Java代碼。對於C++來說,它不會有太大的變化。道歉。 – Bhaskar

0

您還可以執行以下操作使用自動的

#include <iostream> 
using namespace std; 

int Foo() 
{ 
    return 0; 
} 

int main() 
{ 
    // your code goes here 
    auto bar = Foo; 
    return 0; 
}