1

我在 C++ 中有以下文件:

对象.h:

class Object{
    public:
        Object(void);
        ~Object(void);

        GLfloat getLeft();
        GLfloat getRight();
        GLfloat getBottom();
        GLfloat getTop();
};

播放器.h:

    class Player : public Object{
    public:
        Player(void);
        ~Player(void);

        GLfloat getLeft();
        GLfloat getRight();
        GLfloat getBottom();
        GLfloat getTop();
};

平台.h:

class Platform : public Object{
public:
    Platform(void);
    ~Platform(void);

    GLfloat getLeft();
    GLfloat getRight();
    GLfloat getBottom();
    GLfloat getTop();
};

支柱.h:

class Pillar : public Object{
public:
    Pillar(void);
    ~Pillar(void);

    GLfloat getLeft();
    GLfloat getRight();
    GLfloat getBottom();
    GLfloat getTop();
};

碰撞.h:

#include "Player.h"
#include "Platform.h"
#include "Pillar.h"

class Collision
{
public:
    Collision(void);
    ~Collision(void);
    bool CollisionDetect(Object* obj1, Object* obj2);
};

碰撞.cpp:

bool Collision::CollisionDetect(Object* obj1, Object* obj2){
    return !(obj2->getLeft() > obj1->getRight()
        || obj2->getRight() < obj1->getLeft()
        || obj2->getTop() > obj1->getBottom()
        || obj2->getBottom() < obj1->getTop());
}

CollisionDetect 将比较 2 个不同的对象是否发生碰撞,为此我需要特定的 x 和 y 值,但是,对象的类型可能会根据不同的情况而有所不同,并且每种类型的对象将有不同的方法来找到它们的 x 和 y 值. 这意味着我不得不在它们的子类中重新定义相关的 get 方法,但是当我运行这段代码时,我最终会遇到错误:

1>Collision.obj : error LNK2019: unresolved external symbol "public: float __thiscall Object::getLeft(void)" (?getLeft@Object@@QAEMXZ) referenced in function "public: bool __thiscall Collision::CollisionDetect(class Object *,class Object *)" (?CollisionDetect@Collision@@QAE_NPAVObject@@0@Z)
1>Collision.obj : error LNK2019: unresolved external symbol "public: float __thiscall Object::getRight(void)" (?getRight@Object@@QAEMXZ) referenced in function "public: bool __thiscall Collision::CollisionDetect(class Object *,class Object *)" (?CollisionDetect@Collision@@QAE_NPAVObject@@0@Z)
1>Collision.obj : error LNK2019: unresolved external symbol "public: float __thiscall Object::getBottom(void)" (?getBottom@Object@@QAEMXZ) referenced in function "public: bool __thiscall Collision::CollisionDetect(class Object *,class Object *)" (?CollisionDetect@Collision@@QAE_NPAVObject@@0@Z)
1>Collision.obj : error LNK2019: unresolved external symbol "public: float __thiscall Object::getTop(void)" (?getTop@Object@@QAEMXZ) referenced in function "public: bool __thiscall Collision::CollisionDetect(class Object *,class Object *)" (?CollisionDetect@Collision@@QAE_NPAVObject@@0@Z)
1>C:\Users\Student\Dropbox\Work\Year 2\Graphics 1\Coursework\GraphicsCoursework\Debug\GraphicsCoursework.exe : fatal error LNK1120: 4 unresolved externals

是我的继承问题导致了这种情况,还是其他原因?

4

3 回答 3

1

将对象类中的 4 个函数完全设为“虚拟”事实上我建议将其设为纯虚拟,

class Object{
    public:
        Object(void);
        ~Object(void);

        virtual GLfloat getLeft() = 0;
        virtual GLfloat getRight() = 0;
        virtual GLfloat getBottom() = 0;
        virtual GLfloat getTop() = 0;
};  

这将迫使您覆盖派生类中的这四个函数,并提供定义..

于 2013-02-22T04:31:56.387 回答
0

您的每个类,Derived 和 Base 都需要定义这 4 个成员函数。
只有 C++ 中的纯虚函数才允许在没有定义的情况下存在。

另外,派生类中这4个成员函数的重新声明和定义隐藏了基类中的函数。从您的用法来看,您似乎想通过函数覆盖来使用动态多态性,为此您需要使用关键字virtual

于 2013-02-22T04:24:32.657 回答
0

好像你需要virtual功能。

class Object{
    public:
        Object(void);
        ~Object(void);

        virtual GLfloat getLeft()=0;
        virtual GLfloat getRight()=0;
        virtual GLfloat getBottom()=0;
        virtual GLfloat getTop()=0;
};
于 2013-02-22T04:30:18.050 回答