2013-10-27 3 views
0

Я столкнулся с этими двумя ошибками при попытке компиляции.Ошибка в C++: переопределение конструктора класса

Кто-нибудь знает, что случилось?

Думал, может быть, я # включил неправильный заголовочный файл? образец кодов и ошибок согласно следующим:

Ошибка:

Square.cpp:8: error: redefinition of ‘Square::Square(bool, Point*, std::string, int)’ 
Square.h:21: error: ‘Square::Square(bool, Point*, std::string, int)’ previously defined here 
Square.cpp: In member function ‘Point Square::getCoord()’: 
Square.cpp:22: error: expected primary-expression before ‘]’ token 
Square.cpp: In member function ‘void Square::setCoord(Point*)’: 
Square.cpp:32: error: expected primary-expression before ‘]’ token 
Square.cpp:32: error: expected primary-expression before ‘]’ token 

CPP файл

#include "Square.h"` 
#include <cmath> 
using namespace std; 

Square::Square(bool containsWarpSpace, Point coord[], string shapeName, int vertPoint):ShapeTwoD(shapeName, containsWarpSpace) { 

vertPoint = vertPoint; 
coord[] = coord[]; 

} 

int Square::getVertPoint() 
{ 
    return vertPoint; 
} 

Point Square::getCoord() 
{ 
    return coord[]; 
} 

void Square::setVertPoint(int verticleP) 
{ 
    vertPoint = verticleP; 
} 

void Square::setCoord(Point coord[]) 
{ 
    coord[] = coord[]; 
} 

Заголовок:

#include "ShapeTwoD.h" 

class Square : public ShapeTwoD 
{ 
    private: 
     int vertPoint; 
     Point coord[]; 

    public: 
     //Accessor 
     int getVertPoint(); 
     Point getCoord(); 

     //Mutator 
     void setVertPoint(int vertP); 
     void setCoord(Point coord[]); 

     //virtual member 
     virtual double computeArea(Point x, Point y); 

     Square(bool containsWarpSpace, Point coord[], std::string shapeName = "Square", int vertPoint = 4):ShapeTwoD(shapeName, containsWarpSpace){} 

}; 
+0

В заголовке у вас есть ошибочный '{}' в конце определения конструктора - таким образом, определяя функцию в заголовке. – mah

+0

@mah Это не просто '{}', это также список инициализаторов для базового класса, который должен пройти. –

+0

@ DanielFrey да, спасибо, что указали это! – mah

ответ

3

Вы определяете конструктор дважды, один раз в заголовке и один раз в файле реализации. В заголовке, нужно просто объявить его как это:

Square(bool containsWarpSpace, 
     Point coord[], 
     std::string shapeName = "Square", 
     int vertPoint = 4); 

Вы также должны установить обработку coord, может быть что-то вроде изменения coord к

Point* coord; 

и использовать

Point* Square::getCoord() 
{ 
    return coord; 
} 

и

this->coord = coord; 

в конструкторе и setCoord().

Обратите внимание, что ваш способ обработки coord кажется странным и опасным для меня, но без дополнительной информации о том, что вы на самом деле пытаетесь сделать, сложно дать конкретные рекомендации. Как правило, рассмотрите возможность использования стандартных контейнеров над ручным управлением памятью/массивом.

+0

спасибо за помощь Кто-нибудь знает вторую ошибку? – Alien

+0

также выглядит как координата [] = coord []; вызовет проблему, Должен ли это быть координация = координировать; ? Я имею в виду, где когда-либо используется координата, похоже, что она используется неверно. – srsyogesh

+0

@srsyogesh возможно 'this-> coord = coord;'? Если технология компилятора C++ достаточно умна, чтобы знать, когда вы имеете в виду локальную переменную и когда вы имеете в виду переменную класса в эти дни? (Я не говорю, что это не так, но это был первый раз, когда я слышал об этом.) – mah

2

Компилятор четко говорит вам о проблеме:
Дважды вы определили конструктор дважды в файле заголовка и один раз в файле cpp.

Кроме того, что именно вы собираетесь делать с:

coord[] = coord[]; 

Вы должны понимать каждый и каждый оператор кода, который вы пишете. Подумайте, что вы намерены делать? & затем сопоставьте его с грамматикой языка, которую вы изучили.

0

Источник файла:

Square::Square(bool containsWarpSpace, Point coord[], 
       string shapeName, int vertPoint) 
    :ShapeTwoD(shapeName, containsWarpSpace) 
{ 
    vertPoint = vertPoint; 
    coord[] = coord[]; 
} 

Заголовочный файл:

Square(bool containsWarpSpace, Point coord[], 
     std::string shapeName = "Square", int vertPoint = 4) 
    :ShapeTwoD(shapeName, containsWarpSpace) 
{} 

Похоже, две разные версии одной и той же функции.
Тот, что в файле заголовка вызывает конструктор базового класса, но не имеет никакого кода в теле конструктора.

Смежные вопросы