1

私はC++を学び始めました、私はすでにCとJavaを知っています。オブジェクト指向プログラミングを使い始めたいので、学び始めました。

ただし、コンパイラが「Actorのvtableへの未定義の参照」を生成するため、コードに固執しています。ここに、元のエラーではなく、同じエラーを生成するコードがあります。これは、明確性が低いためです。何が原因なのか本当にわかりません。

struct Actor
{
     int x, y;
     virtual void move();
};

struct Player : Actor
{
     Player(int a, int b)
     {
        x = a;
        y = b;
     }

     void move();
     void draw();
};

void Player::move()
{
    ++x;
};

main()
{
    Actor *act;

    act = new Player(10, 20);
}

この質問はばかげているかもしれません、私は知りません、私はどこでも掘りましたが、私の問題を解決するものは何も見つかりませんでした。

4

5 に答える 5

8

virtual void move();純粋仮想関数を作成する必要があります。

virtual void move() = 0;

Actor::move()または基本クラスを定義する

void Actor::move() 
{
    // do something
}
于 2012-08-18T16:57:50.333 に答える
2

アクターで定義

virtual void move() = 0;

それ以外の

virtual void move();
于 2012-08-18T16:58:32.733 に答える
0

vtableへのエラー未定義の参照は、通常、仮想関数が宣言されているが定義されていないことを意味します。

于 2012-08-18T17:30:40.933 に答える
0

@Maximはあなたのケースで答えを提供しましたが、より一般的に言えば(@Maximによって提供されたリンクから):

解決策は、純粋ではないすべての仮想メソッドが定義されていることを確認することです。純粋仮想として宣言されている場合でも、デストラクタを定義する必要があることに注意してください。

私をひどく停止させたのは、上記の引用の最後の文ですが、これは一見して明らかではありません。

于 2012-09-01T20:45:14.143 に答える
0

仮想関数を持つすべてのクラスについて、すべての仮想関数へのポインターを持つvtableで作成されたクラスのエントリ。

仮想ボイドmove();が発生するため。基本クラスでの宣言では、コンパイラはクラス定義を検索します(つまり、uが定義されていないため、vtablewhochの対応するエントリはここでは使用できません)。

したがって、純粋仮想関数はエラーを解決します。

于 2013-02-27T07:47:31.327 に答える