2012-02-19 63 views
2

我有一個函數:Vector::Vector integrate(Vector::Vector start, Vector::Vector end, long int elapsedtime);,其中Vector是我創建了一個類:通過新對象到功能


class Vector { 
    public: 
    double x, y, z; 
        Vector(); 
        Vector::Vector addToSelf(Vector &right); 
}; 

我想打電話給integrate一個空白Vector爲它的第一個參數。 Vector的構造函數默認爲這樣,所以我試圖這樣做:

acceleration = integrate(Vector::Vector blank, wc.readAccelerometer(), time);

然而,這給了我的錯誤:

error: expected primary-expression before ‘blank’

我想也許我並不需要給予Vector一個名字,當我在integrate函數調用創建:

acceleration = integrate(Vector::Vector, wc.readAccelerometer(), time);

,但是這給了我同樣的錯誤:

expected primary-expression before ‘,’ token

我總是可以傳遞一個指針,更改integrate簽名以匹配,但這似乎不必要地混亂。我還可以創建一個新的Vector然後通過它來integrate


Vector::Vector blank; 
acceleration = integrate(blank, wc.readAccelerometer(), time); 

這工作沒有錯誤,但我還以爲這樣做就一氣呵成將是可能的。我究竟做錯了什麼?

編輯:感謝Karl von Moor的評論,我修復了它 - 將Vector::Vector更改爲Vector(因爲我沒有定義命名空間)並且一切正常。謝謝。

+2

Vector Vector也是一個命名空間,或者我有什麼需要通過Vector :: Vector來理解? – 2012-02-19 16:32:52

+0

類「Vector」處於默認名稱空間。 'Vector :: Vector blank'是什麼意思;'? – Mahesh 2012-02-19 16:36:18

+0

@Karl von Moor我沒有定義任何命名空間。交換'Vector :: Vector'爲'Vector'修復了一些事情 - 我只是將'Vector'從類struct中重構爲它自己的類,並沒有點擊這個事實,我不應該將它引用爲我曾是。謝謝! – simont 2012-02-19 16:36:37

回答

4

這一行是不正確的C++語法:

acceleration = integrate(Vector::Vector blank, wc.readAccelerometer(), time); 

要創建默認構造Vector對象,使用Vector()

acceleration = integrate(Vector(), wc.readAccelerometer(), time); 

在C++ 11,則也可以編寫Vector{}甚至{}來構造一個值初始化的對象。

請注意,通常您希望通過引用const來傳遞「大」對象以避免不必要的副本。因此,請嘗試將integrate的聲明更改爲:

Vector integrate(const Vector& start, const Vector& end, long int elapsedtime); 
1

請勿在類聲明和函數的參數名稱中使用作用域解析運算符。因此,請刪除Vector::,直到您未定義該功能爲止。例如:

// declaration 
class A { 
A(); 
void f(int x); 
}; 

// definitions 
A::A(){/*...*/}; 

A::f(int x){/*...*/}; //note that the parameter x doesn't have a `::`