2016-03-02 84 views
0

在我正在開發的程序中,我已經聲明瞭main中的一個矢量。我有兩個使用向量的函數:一個int函數和一個標準的void「print」函數。我試圖在void函數中使用一個函數指針(指向int函數),但我得到的錯誤是該向量尚未聲明,即使它在main中。我試過在main之外聲明vector,並且該函數運行良好,但是我仍然猶豫是否將它保留在main之外。我想知道在main函數中聲明時是否有某種方法在void函數中使用vector。下面是一些示例代碼要問我:C++通過函數指針調用函數中的矢量

// Example program 
#include <iostream> 
#include <vector> 
using namespace std; 

int returnSquare(vector<int>& numbers); 
void print(int (*squarePtr)(vector<int>&)); 
int (*squarePtr)(vector<int>&); 

int main() 
{ 
    vector<int> v(1); 
    squarePtr = &returnSquare; 

    for(int i = 0; i < v.size(); i++) 
    { 
     v.at(i) = i * 25; 
     cout << v.at(i) << " "; 
    } 

    print(squarePtr); 

    return 0; 
} 

int returnSquare(vector<int>& numbers) 
{ 
    int product = 0; 
    for(int i = 0; i < numbers.size(); i++) 
    { 
     product = numbers.at(i) * numbers.at(i); 
    } 
    return product; 
} 

void print(int (*squarePtr)(vector<int>&)) 
{ 
    int answer = (*squarePtr)(v); 
    cout << answer << endl; 
} 

回答

1

在你的函數print你只有一個參數。打電話給你的平方函數,你需要傳遞給方給它的載體,是這樣的:

void print(int (*squarePtr)(vector<int>&), vector<int> &v) 
{ 
    int answer = (*squarePtr)(v); 
    cout << answer << endl; 
} 

沒有這個變量v不是在函數內部可見。該呼叫應該看起來像:

print(squarePtr, v); 

不太重要。您在全局定義中使用兩次squarePtr名稱。這不會給你的代碼帶來清晰。你最好寫:

​​
0
void print (int (*squarePtr)(vector<int>&)) 

此參數只接受一個指向您的二次函數,僅此而已。它不包含指針或對v變量的引用。您的打印功能不知道v是什麼,除非您將v作爲參數或使v成爲全局變量(這是您將它移出主體的那個)。

這樣做:

// Modify your print definition to accept a reference to your vector `v` 
void print(int (*squarePtr)(vector<int>&), vector<int>& v); 

// Add `v` as the second argument to your print call 
print(squarePtr, v); 

// Modify the definition of your print function to accept a reference to your vector `v` 
void print(int (*squarePtr)(vector<int>&), vector<int>& v) 
{ 
    ... 
}