2017-05-29 124 views
-1

我必須使用vector上的'generate'函數來創建10個對象。我有一個構造函數類Point:C++ vector生成函數類對象

Point(){ 
     this->x=rand()%100; 
     this->y=rand()%100; 
}; 

然後,我創建一個向量,並使用 '生成' 功能:

vector<Point> v (10); 
generate (v.begin(), v.end(), Point()); 

當我編譯它,我收到此錯誤:

Type 'Point' does not provide a call operator 

我不知道爲什麼。

+0

STD功能::產生預期的函數對象。看看那個。 – DeiDei

回答

3

它看起來像你想用缺省構造的實例Point填充向量。

在發現您的實際問題之前,不需要撥打std::generate,因爲v已經有10個默認構建的實例Point

但是,如果您確實想要調用它,std::generate預計爲Generator函數對象,即具有operator()的對象。 Point沒有一個,編譯器抱怨。傳遞一個lambda是一個好主意,因爲他們是這樣的函數對象:

std::generate(v.begin(), v.end(), []() { 
    return Point{}; 
}); 
+0

現在是正確的。謝謝 :) –

2

的原型發生器功能描述here。它必須是一個返回下一個要生成的值的函數。您正在傳遞一個默認構造的實例Point。也許你試圖提供Point的構造函數作爲生成器函數,但構造函數不符合要求(它不返回任何內容),不應該直接調用它,並且它的地址永遠不會被獲得(你也不能一個參考)。

您必須提供一個單獨的函數,只需返回點。最簡單的方法是通過std::generate一個lambda函數。你會做這樣的事情:

std::vector<Point> v(10); 
std::generate(v.begin(), v.end(), []() { return Point{}; }); 

但是,請注意線路std::vector<Point> v(10);已創建10個默認的構造Point對象。由於您的隨機化邏輯在您的默認構造函數中,因此在這種情況下使用std::generate是多餘的。

0

你需要生成點

Point RandomPoint() { return Point(); } 

int main(int argA, char** argV) 
{ 
    vector<Point> v(10); 

    generate(v.begin(), v.end(), RandomPoint); 

    return 0; 
}