-1

リンクされたリストに非常に慣れていないため、これが機能しない理由がわかりません。

プログラムはクラッシュせず、コンパイラはエラーを表示しませんが、doActions()実行されません。

これは関数のコードで、メイン ループで呼び出されます。

void Action()
{
    clsParent* pCurrent;
    pCurrent = pHead;
    while(pCurrent != NULL)
    {
        clsPlayer* pPlayer;
        pPlayer = dynamic_cast<clsPlayer*>(pCurrent);
        if(pPlayer != NULL)
        {
            pPlayer->doActions();
        }
        pCurrent = pCurrent->pNext;
    }
}

これは、リスト内のすべてのプレイヤーを呼び出すことになってdoActions()います (ただし、プレイヤーは 1 つしかありません)。

doAction()リンクされたリストをコードに実装しようとする前は完全にうまく機能していたので、そうではないことがわかりました。それが何をするのか興味がある人のために、プレイヤーがジャンプしているかどうかをチェックし、それに応じてプレイヤーを動かします。

編集:他の機能を入れることができ、それが機能することに気づきました

これは機能します:

void clsPlayer::jump()
{
    if(onGround)
    {
        jumping = true;
        yPos -= gravitySpeed;
        animationState = 3;
    }
}

これはそうではありませんが

void clsPlayer::doActions()
{
    if(!onGround)
    {
        yPos += gravitySpeed;
    }

    if(jumping)
    {
        jumpTimeCounter++;
        yPos -= 20;
        if(jumpTimeCounter > 10)
        {
            jumping = false;
            jumpTimeCounter = 0;
        }
    }
}
4

2 に答える 2

1

clsParent タイプまたはそのサブクラスの場合は pCurrent。clsPlayer 型への dynamic_cast は常に失敗し、null を返します。おそらくメンバーデータがあり、次のようなものを使用する必要があります(キャストは必要ない場合もあります):

clsPlayer* pPlayer;
pPlayer = dynamic_cast<clsPlayer*>(pCurrent->data);
于 2012-11-07T15:12:26.457 に答える
0

あなたが投稿したコードから、次の提案された解決策を提供します。

template<T>
class ListNode
{
public:
    T* m_pNext;
};

class Base : public ListNode<Base>
{
public:
    Base();
    virtual ~Base();
    virtual void doActions() = 0;
};

class Derived1 : public Base
{
public:
    Derived1();
    virtual ~Derived1();
    virtual void doActions();
};

class Derived2 : public Base
{
public:
    Derived2();
    virtual ~Derived2();
    virtual void doActions();
};

void action()
{
    Base* pCurrent = pHead;
    while (pCurrent != NULL)
    {
        pCurrent->doActions();
        pCurrent = pCurrent->m_pNext;
    }
}

注意事項:

  1. ListNode はテンプレート クラスであり、基本クラス (この例では clsParent) はそれを継承します。
  2. 基本クラスは doActions を純粋仮想関数として宣言するため、派生クラスは独自の特定の実装を定義できます。
  3. 1 と 2 の結果として、キャストを回避したため、リストをウォークスルーして doActions メソッドを呼び出すループが単純化されていることに注意してください。
于 2012-11-07T16:03:14.707 に答える