2013-10-25 2 views
0

Это мой базовый класс Shape.hс ++ Наследование база и подклассов

#ifndef Shape_H 
#define Shape_H 

#include <iostream> 
using namespace std; 

class Shape 
{ 
    protected: 
    string name; 
    bool containsObj; 

public: 
    Shape(); 
    Shape(string, bool); 
    string getName(); 
    bool getContainsObj(); 
    double computeArea(); 
}; 

    #endif 

Shape.cpp

#include "Shape.h" 

Shape::Shape(string name, bool containsObj) 
{ 
    this -> name = name; 
    this -> containsObj = containsObj; 
} 
string Shape:: getName() 
{ 
return name; 
} 
bool Shape::getContainsObj() 
{ 
    return containsObj; 
} 

и это мой подклассов. Cross.h

#ifndef Cross_H 
#define Cross_H 

#include <iostream> 
#include "Shape.h" 
using namespace std; 

class Cross: public Shape 
{ 
protected: 
    int x[12]; 
    int y[12]; 
public: 
    Cross(); 
    double computeArea(); 

}; 

#endif 

Cross.cpp

#include "Cross.h" 

Cross::Cross() 
{ 

    for (int i = 0; i < 12; i++) 
    { 
     this -> x[i] = 0; 
     this -> x[0] = 0; 
    } 

} 

Форма и Крест находятся в разных файлах, но в той же папке. Странно, когда я компилирую это, ошибки, которые я никогда раньше не видел, такие как «В функции« ZN5CrossC1Ev », неопределенная ссылка на Shape :: Shape(),« ZN5CrossC1Ev », неопределенная ссылка на Shape :: Shape() , undefined ссылка на WinMain @ 16 ".

Я попытался выполнить некоторую отладку. Когда я удаляю конструктор Cross, он отлично работает. Но я определенно нуждаюсь в этом. Кто-нибудь может мне это объяснить?

+0

Являются ли части, которые вы завернули в '# ifdef' в отдельных заголовочных файлах, а код находится в исходных файлах (.cpp)? Похоже, у вас возникают проблемы с компоновщиками, которые, вероятно, связаны с компиляцией заголовков в качестве источника. –

+0

Несвязанный: Do * not * put 'using namespace std;' в файлах заголовков. Хотя это может показаться удобным, это будет один день, чтобы укусить вас. Полностью квалифицируйте стандартные объекты пространства имен библиотеки в заголовках (и везде, если это вообще возможно). – WhozCraig

+0

Также не относится: ', хотя он может быть включен в' 'его лучшей идеей включить' 'тоже, если вы удалите' ', а затем забудьте указать другие зависимости (например, 'string'). –

ответ

4

Вы не определили конструктор по умолчанию, но вы его объявили Shape();. Единственным конструктором, который вы определили, является параметр string и boolShape(string, bool);.

добавления

Shape::Shape() 
{ 
} 

или удаление

Shape(); 

будет исправить.


Для будущей отладки более внимательно прочитать эту ошибку, это точно объясняет, что случилось:

undefined reference to Shape::Shape() 
+0

Привет, я сделал то, что вы мне сказали, я вынул Shape(); У меня теперь есть другая ошибка, не соответствующая функция для вызова Shape :: Shape(), которая указывает мне на Cross :: Cross(), кандидаты - ShapeTwoD (string, bool); – June

+0

@June Попробуйте добавить определение, если изъятие декларации не работает. Причина, по которой это может не понравиться, заключается в том, что построение «Кросс» также вызывает конструктор «Shape», способ сделать это без указания конструктора по умолчанию для «Shape» заключается в изменении «Cross :: Cross() {. ..} 'to 'Cross :: Cross(): Shape (some-string, some-bool) {...}', поэтому вместо этого он вызывает сложный конструктор. –

2

Вы объявили конструктор по умолчанию для Shape, но не определили его в любом месте. Конструктор по умолчанию для Cross использует его неявно для инициализации своего базового класса.

вариант

Вы:

  • Определить конструктор, если вы хотите Shape быть по умолчанию-конструктивно;
  • В противном случае удалите декларацию и получите Cross для инициализации Shape с другим конструктором.
Смежные вопросы