Преобразование из указателя производного класса в указатель базового класса не работает, когда файлы разбиты на файлы .cpp и .h - PullRequest
0 голосов
/ 21 октября 2011

Shape.h

#include"Circle.h"
#include"Square.h"
class Shape {
public:
    virtual void Draw() = 0;        
    static Shape* Create(std::string type);
};

Shape.cpp

#include "Shape.h"
Shape* Shape::Create(string type) {
    if ( type == "circle" ) return new Circle();
    if ( type == "square" ) return new Square();
    return NULL;
}

Circle.cpp

#include "Circle.h"
void Circle::Draw() {
    cout << "I am circle" << endl;
}

Circle.h

#include"Shape.h"
class Circle:public Shape {
public:
    void Draw();
    friend class Shape;
};

Square.cpp

#include "Square.h"
void Square::Draw() {
    cout << "I am Square" << endl;
}

Square.h

#include"Shape.h"
class Square:public Shape {
public:
    void Draw();
    friend class Shape;
};

Выдает эту ошибку: Ошибка Square.h: ожидаемое имя класса перед {token [для наследования, которое не идентифицируетсяShape]

Но тот же код работает, если он находится в монолитном файле (без .cpp и .h) в одном файле main.cpp. Чего мне не хватает, включая заголовочные файлы?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Вам необходимо удалить #include "Square.h" и #include "Circle.h" из Shape.h.

Square и Circle зависят от определения Shape, поскольку они оба наследуются от Shape, но Shape может - и должен - быть определен до определения Square и Circle, поэтому определения Circle и Square до определения Shape являются неправильными.

2 голосов
/ 21 октября 2011

Вы создали циркулярное включение.Shape.h включает Circle.h и Square.h.Circle.h и Square.h включают Shape.h.Это не имеет никакого смысла.

По-видимому, вы также используете какие-то защитные щитки, которые вы здесь не показываете (если вы этого не сделаете, ошибка будет другой).Защитники включают в себя, что Shape.h не входит в себя.В результате Square.h включается в Shape.h до определения Shape, поэтому вы получаете ошибку.

Циркулярное включение всегда бесполезно.Почему

#include "Circle.h"
#include "Square.h"

присутствует в Shape.h?Что это включает в себя делать там?Вы должны убедиться, что вы не включили Circle.h и Square.h в Shape.h.

...