Ошибка 5 Ошибка C2535 Функция-член уже определена или объявлена. VisualStudio 2013

0

У меня возникли некоторые проблемы с этим кодом, моя 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;
}
Теги:
visual-studio-2013

1 ответ

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. Вероятно, это ошибка...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню