2016-04-25 86 views
0

我试图用+来添加2矢量(数学矢量)。这里是我的代码:运算符超载作为朋友函数错误

class Vector{ 
    double v[Max_size]; 
    int dim; 
public: 
    int getDim() const; 
    Vector(); 
    Vector(int n); 
    Vector(const Vector& a); 
    Vector add(const Vector&b); 
    friend Vector operator+(Vector summand1, Vector summand2); 
}; 

运算符重载:

Vector operator+(Vector summand1, Vector summand2){ 
    int dim1 = summand1.getDim(); 
    int dim2 = summand2.getDim(); 
    assert(dim1 == dim2); 
    Vector sum(dim1); 
    int i; 
    for(i = 0; i < dim1; i++){ 
     sum.v[i] = summand1.v[i] + summand2.v[i]; 
    } 
    return sum; 
} 

我如何使用它:

Vector m = v+t; 

当我运行的代码,它总是显示m是(0,0 )(2D向量),这是构造函数生成的默认值。它出什么问题了?谢谢!

+0

您的问题不在于发布的代码中,您能否发布更多详细信息以便我们运行代码? – WhiZTiM

+1

我一定想看看复制构造函数。 –

+0

顺便说一句...为了提高效率,我建议你阅读下面的内容:http://stackoverflow.com/a/414260/1621391 – WhiZTiM

回答

1

你的拷贝构造函数:

Vector::Vector(const Vector& a){ 
    dim = a.dim; 
    Vector(dim); 
} 

正确设置dim成员的值,但并没有其他副作用。

你应该有下面的代码的变体:

Vector::Vector(const Vector& a) : dim(a.dim) { 
    std::copy(std::begin(a.v), std::end(a.v), v); 
} 

这实际上将复制存在于参数的数据,你将看到代码的正确行为:

// Copy constructor called here, but did not correctly copy the data before. 
Vector m = v + t; 

为了更好地(因此我打算更简单和更安全)Vector类,如果您有权访问至少符合C++ 11的编译器,则可以编写:

class Vector{ 
    std::array<double, Max_size> v; // Note the std::array here. 
    int dim; 
public: 
    int getDim() const; 
    Vector(); 
    Vector(int n); 
    Vector(const Vector& a); 
    Vector add(const Vector&b); 
    friend Vector operator+(Vector summand1, Vector summand2); 
}; 

std::array会照顾的,只要你写你的拷贝构造函数是这样的:

Vector::Vector(const Vector& a) : v(a.v), dim(a.dim) { 

} 

,或者甚至更好,然后你可以让编译器生成的拷贝构造函数本身,与同行为。

+0

宾果!但dim(a.dim)是什么意思? –

+0

以及您何时复制暗淡值?谢谢! –

+0

dim(a.dim)用值a.dim构造dim成员。在C++中,它是首选的,更优化的,有时也是必须的,以便像这样初始化类成员。搜索“成员初始化列表”以获取关于此语法的更多信息。 – rems4e