2015-02-05 4 views
1

У меня есть вопрос, который я довольно смущен. Сейчас у меня есть абстрактный класс GameObject и класс Sprite2D, который унаследован от класса GameObject.Абстрактные классы и наследование C++

Однако я обнаружил, что когда я пытаюсь реализовать дополнительные функции, не определенные в классе GameObject, компоновщик бросает LNK2001: ошибки неразрешенного внешнего символа. Однако они исчезают, когда я объявляю чистые виртуальные определения новых функций в GameObject.

Почему? Есть ли какие-то полезные источники, к которым я могу обратиться, чтобы лучше понять взаимосвязь между абстрактными классами и наследованием? Благодаря!

P.S. Для тех, кто заинтересован, мои заголовки GameObject и Sprite2D находятся ниже.

GameObject.h:

#ifndef GAMEOBJECT_H 
#define GAMEOBJECT_H 

class GameObject 
{ 
private: 
    class Concept 
    { 
    public: 
     virtual void Update() = 0; 
     virtual void Draw() = 0; 
    }; 

    template <typename T> 
    class Model : public Concept 
    { 
    public: 
     Model(T base) : newObj(base) 
     { 

     } 

     void Update() 
     { 
      newObj.Update(); 
     } 

     void Draw() 
     { 
      newObj.Draw(); 
     } 

    private: 
     T newObj; 
    }; 

    Concept *pC; 

public: 
    template <typename T> 
    GameObject(T newObj) : pC(new Model <T>(newObj)) 
    { 

    } 

    void Update() 
    { 
     pC->Update(); 
    } 

    void Draw() 
    { 
     pC->Draw(); 
    } 
}; 

#endif 

Sprite2D.h:

#ifndef SPRITE2D_H 
#define SPRITE2D_H 

#include "GameObject.h" 

#include "AEEngine.h" 
#include <string> 

class Sprite2D : public GameObject 
{ 
protected: 
    std::string name; 
    AEVec2 position, scale, direction, velocity, acceleration; 
    f32 rotation{ 0.0f }; 
    AEGfxVertexList * pMesh{ nullptr }; 
    AEGfxTexture * pTex{ nullptr }; 
    struct AABB{ AEVec2 min; AEVec2 max; } boundingBox; 
    bool isAlive; 

    void CreateMesh(AEVec2, AEVec2, u8, u8, u8, u8); 
    void CreateMesh(AEVec2, AEVec2, const char *); 

public: 
    //Constructors 
    Sprite2D(); 
    Sprite2D(const char *name, f32 xPos, f32 yPos, f32 xSize, f32 ySize, u8 alpha, u8 red, u8 green, u8 blue); 
    Sprite2D(const char *name, f32 xPos, f32 yPos, f32 xSize, f32 ySize, const char *texPath); 
    //Destructor 
    ~Sprite2D(); 

    virtual void Update(); 
    virtual void Draw(); 

    void SetAlive(bool); 
    bool IsAlive(); 

    void SetName(std::string); 
    std::string GetName(); 

    void SetPosition(AEVec2); 
    AEVec2 GetPosition(); 

    void SetScale(AEVec2); 
    AEVec2 GetScale(); 

    void SetDirection(AEVec2); 
    AEVec2 GetDirection(); 

    void SetRotation(f32); 
    f32 GetRotation(); 

    void SetVelocity(AEVec2); 
    AEVec2 GetVelocity(); 

    void SetAcceleration(AEVec2); 
    AEVec2 GetAcceleration(); 

    void SetBoundingBox(f32 sizeX, f32 sizeY); 
    AABB GetBoundingBox(); 
}; 

#endif 
+1

Вы просто добавляете объявления функции-члена в класс 'Sprite2D', или добавляете ли вы фактические реализации этих функций? И если вы добавляете реализации, добавляете ли вы их в файл, который построен вместе с остальной частью проекта? –

ответ

0

Убедитесь, что вы на самом деле реализовать эти методы, и файл (ы) их реализации включены в цели, которую вы» re building

+0

Да, я действительно реализовал функции в другом .cpp-файле и обязательно включил соответствующие файлы заголовков. Я просто решил не публиковать их здесь для краткости. –

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