2012-02-19 68 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 `::`