У меня возникли некоторые проблемы с этим кодом, моя Visual Studio 2013 сообщает об этой ошибке: "Ошибка 5 ошибки. Функция члена C2535 уже определена или объявлена". Я отметил код, где именно это происходит.
#ifndef __NORMAL_H_INCLUDED__
#define __NORMAL_H_INCLUDED__
class Normal{
public:
double x;
double y;
double z;
Normal(double x, double y, double z);
Normal(double x, double y);
Normal();
};
#endif
#include "Normal.h"
Normal::Normal(double x=0, double y=0, double z=0){
this->x = x;
this->y = y;
this->z = z;
}
Normal::Normal(double x=0, double y=0){
this->x = x;
this->y = y;
this->z = 0;
} // ERROR HERE = Error 5 error C2535 member function already defined or declared
Normal::Normal(){
x=0;
y =0 ;
z =0;
}
Компиляция кода с помощью clang++ дает следующую ошибку:
normal.cpp:12:23: error: addition of default argument on redeclaration makes this
constructor a default constructor
Normal::Normal(double x=0, double y=0, double z=0){
^ ~
normal.cpp:7:5: note: previous declaration is here
Normal(double x, double y, double z);
^
normal.cpp:19:23: error: addition of default argument on redeclaration makes this
constructor a default constructor
Normal::Normal(double x=0, double y=0){
^ ~
normal.cpp:8:5: note: previous declaration is here
Normal(double x, double y);
Скорее всего, это хороший способ сказать это. Компилятор не может определить разницу между:
Normal n = Normal();
а также
Normal m = Normal(0, 0);
или
Normal o = Normal(0, 0, 0);
Если вы всегда хотите, чтобы аргументы были заполнены нулями, просто используйте одну форму:
class Normal{
public:
double x;
double y;
double z;
Normal(double x = 0, double y = 0, double z = 0);
};
Никогда не ставьте аргументы по умолчанию в части реализации, независимо от того, есть ли у вас их в заголовке или нет, поскольку соблазн будет заключаться в том, чтобы изменить их в реализации или заголовке отдельно, а затем вы получите ОЧЕНЬ запутанные результаты.
Конечно, вы можете подумать о двух или трех разных конструкторах конструктора и не иметь значений по умолчанию. Но выберите один из этих двух. Или используйте конструктор с одним значением "должно иметь", а "без значений". Передача аргументов, конечно, добавит больше кода в вызывающий код, поэтому в большом проекте, где Normal
объекты создаются МНОГО раз с различным количеством объектов, может существовать значительная разница в размере между прохождением трех double
аргументов и не пропусканием каких-либо аргументы.
Добавлю, что код компилируется в g++
версии 4.8.2. Вероятно, это ошибка...