1

私はC++で次のファイルを持っています:

Object.h:

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

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

Player.h:

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

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

Platform.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();
};

Collision.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;
};  

これにより、派生クラスでこれら 4 つの関数をオーバーライドし、定義を提供することが強制されます。

于 2013-02-22T04:31:56.387 に答える
0

各クラス、DerivedおよびBaseは、これらの4つのメンバー関数を定義する必要があります。
C ++の純粋仮想関数のみが、定義なしで存在できます。

また、派生クラスのこれら4つのメンバー関数の再宣言と定義は、Baseクラスの関数を非表示にします。あなたの使用法から、あなたは関数のオーバーライドを通して動的ポリモーフィズムを使いたいようです、そしてそのためにあなたはキーワードを使う必要があります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 に答える