2016-04-25 7 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; 

Когда я запускаю код, он всегда показывает, что т (0,0) (2D-вектор), который является значением по умолчанию, созданным конструктором. Что с этим не так? Благодаря!

+0

Ваша проблема не в размещенном коде, можете ли вы разместить более подробную информацию, которая позволит нам запустить код? – WhiZTiM

+1

Я определенно хочу увидеть конструктор копирования. –

+0

BTW ... по соображениям эффективности я предлагаю вам прочитать следующее: 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. В C++ предпочтительнее, более оптимизировано и иногда необходимо инициализировать таких членов класса. Найдите «список инициализации члена» для получения дополнительной информации об этом синтаксисе. – rems4e