2013-03-17 8 views
0

Так что это декларация метода в общественном наследованию векторного класса:Что не так с этим методом добавления?

Vector Addition(Vector a, Vector b); 

А вот реализация за пределами класса:

Vector Vector::Addition(Vector a, Vector b) 
{ 
    Vector temp = *this; 
    temp.x=a.x+b.x; 
    temp.y=a.y+b.y; 
    return temp; 
} 

И когда я делаю это в основной функции :

Vector c(0,0),a(0,0),b(0,0); 
c=Addition(a,b); 

Я получаю сообщение об ошибке: Идентификатор «Дополнение» не определен. Пожалуйста помоги!

+5

Если вы хотите использовать 'Addition' таким образом она должна быть свободной функцией, а не метод. –

+0

За исключением этого '* this' не будет работать. Я не уверен, что это предлагает над 'return {a.x + b.x, a.y + b.y};', хотя, с соответствующим конструктором. – chris

ответ

3

С вашей Addition функции является членом Vector, вы должны назвать его как таковой:

c = Vector::Addition(a, b); 

или

c = a.Addition(b); 

Обратите внимание, что первый из них требует функцию Addition быть статическим, что означает, что он не работает в конкретном примере (this в корпусе функции):

static Vector Addition(Vector a, Vector b); 

Но тогда вы не можете получить доступ к this указатель, так что у вас есть по умолчанию, построить temp вместо того, чтобы брать копию (которая, кстати, не используется, так как вы перезаписать x и y в любом случае).

Второй использует левый операнд в качестве указателя this в вашей реализации (нет a в подписи).

Vector Addition(Vector b) 
{ 
    Vector temp = *this; 
    temp.x += b.x; 
    temp.y += b.y; 
    return temp; 
} 

Обратите внимание, что вы также можете операторы перегрузки в C++. Для этого определяют функцию нестатический члена под названием operator+, который принимает второй экземпляр (первый экземпляр является this указателя в функции которого будет левая часть операнда):

Vector operator+(const Vector &other) const; 

Реализация (одна возможность):

Vector Vector::operator+(const Vector &other) 
{ 
    Vector temp = *this; 
    temp.x += other.x; 
    temp.y += other.y; 
    return temp; 
} 
+0

Ничего себе, спасибо за такие замечательные ответы, все вы. – A6SE

+0

Просто еще один вопрос. Почему вы должны написать const в скобках перегруженного оператора +? Это ошибка, если вы просто пишете Векторный оператор + (Вектор и прочее); – A6SE

+0

@ A6Tech, вы не изменяете его, так зачем делать его неконстантным? Это просто ограничивает то, что вы можете передать, будь то объекты const или временные. Обратите внимание, что другой популярный метод - использовать свободную функцию, взять левую сторону по значению и вызвать на ней 'operator + ='. – chris

4
c=Addition(a,b); 

Сообщает компилятору о вызове функции автономной функции. Вы предоставили функцию-член, а не отдельную функцию, поэтому компилятор не может найти и жалуется.

Вам необходимо предоставить автономную функцию.

1

Вы объявили Addition внутри Vector. Правильный способ был бы ...

(1) Есть как глобальная функция. Это связано с тем, что вы принимаете определение дополнения из класса Vector.Таким образом, это будет выглядеть как

Vector Addition(/*parameters*/) { /* implementation */ } 

(2) Сделать Добавление статическим с static ключевым словом, и назвать его с кодом c = Vector::Addition(a, b).

Код будет выглядеть

class Vector{ 
static Vector Addition(/* arguments */); 
} 

Vector Vector::Addition(/*arguments*/) {/*implementation*/} 
Смежные вопросы