Я не могу понять, что с этим.
У меня есть класс Scene, который имеет вектор сущностей и позволяет вам добавлять и получать сущности со сцены:
class Scene {
private:
// -- PRIVATE DATA ------
vector<Entity> entityList;
public:
// -- STRUCTORS ---------
Scene();
// -- PUBLIC METHODS ----
void addEntity(Entity); // Add entity to list
Entity getEntity(int); // Get entity from list
int entityCount();
};
Мой класс сущностей выглядит следующим образом (вывод для тестирования):
class Entity {
public:
virtual void draw() { cout << "No" << endl; };
};
А потом у меня есть класс Polygon, который наследуется от Entity:
class Polygon: public Entity
{
private:
// -- PRIVATE DATA ------
vector<Point2D> vertexList; // List of vertices
public:
// -- STRUCTORS ---------
Polygon() {}; // Default constructor
Polygon(vector<Point2D>); // Declare polygon by points
// -- PUBLIC METHODS ----
int vertexCount(); // Return number of vertices
void addVertex(Point2D); // Add vertex
void draw() { cout << "Yes" << endl; }; // Draw polygon
// -- ACCESSORS ---------
Point2D getVertex(int); // Return vertex
};
Как видите, у него есть метод draw (), который должен переопределять метод draw (), который он наследует от класса Entity.
Но это не так. При использовании следующего кода:
scene->getEntity(0).draw();
где сущность 0 является полигоном (или, по крайней мере, должен быть), он выводит «Нет» из родительского метода (как будто это не полигон, а просто сущность). На самом деле, это не позволяет мне вызывать любые методы, уникальные для Polygon, без получения:
' имя некоторого метода ': не является членом 'Entity'
Так есть идеи, что случилось?
Спасибо за помощь.
UPDATE:
Итак, я реализовал код, указанный в первом ответе, но я не уверен, как добавить свой многоугольник в список. Как то так?
const tr1::shared_ptr<Entity>& poly = new Polygon;
poly->addVertex(Point2D(100,100));
poly->addVertex(Point2D(100,200));
poly->addVertex(Point2D(200,200));
poly->addVertex(Point2D(200,100));
scene->addEntity(poly);
Я просто не привык к этому делу shared_ptr.