2

私はこの[不完全な]関数を持っています:

void EditorWindow::OnLMClick(SObjectType sOT, short xPos, short yPos)
{
    SObject* pSObject;

    int nElements;

    switch(sOT)
    {
        case SOT_Tile:      nElements=TILETYPE_COUNT;       pSObject = pSOTile[0];      break;
        case SOT_Surface:   nElements=SURFACEBMP_COUNT;                                 break;
        case SOT_Object:    nElements=OBJECTBMP_COUNT;                                  break;
        case SOT_Edit:      nElements=EDITBMP_COUNT;                                    break;
        default:    MessageBox(NULL,"Switch does not include this SObjectType","Error in EditorWindow::OnLMClick()",NULL); return;
    }

    // From there on, pSObject may be pointing to any array of its child classes
    for (int n = 0; n<nElements; n++)
    {
        if (xPos > pSObject->coor.X &&
            xPos < pSObject->coor.X + pSObject->size.Width &&
            yPos > pSObject->coor.Y &&
            yPos < pSObject->coor.Y + pSObject->size.Height)
        {
            selectedItemRect.left       =       pSObject->coor.X;
            selectedItemRect.top        =       pSObject->coor.Y + pSObject->size.Width;
            selectedItemRect.right      =       pSObject->coor.X;
            selectedItemRect.bottom     =       pSObject->coor.Y + pSObject->size.Height;
        }
        *(pSObject++);
    }
    Display();
}

pSObject が配列 pSOTile の次の要素を指すようにしようとしています。どうやってやるの?関数を更新すると、pSObject は最終的に SOTile 以外の子を指す可能性があることに注意してください。

4

1 に答える 1

0

まあ、これはうまくいかないかもしれませんが、学校でデータ構造を繰り返していたことを思い出します。通常、クラス内でクラス ポインター メンバーを宣言します。CTile だけでなく、クラスの継承を使用して目標を達成していると仮定しますが、そうではないかもしれません。

class YourClass : public base {
    private:
        // Your Stuffs
    public:
        // More stuffs
}

ここで、base で、コンストラクターで常に push_back する静的ベクター base* ポインターを宣言します。次に、オブジェクトを反復したい場合は、ポインターを反復できます。

class base {
    private:
        static std::vector<base*> AllMyFoos;
    //rest of your foos
}

.cpp で、init を忘れないでください。std::vector<base*> base::AllMyFoos; ベースを継承するすべてのコンストラクターに次を追加します。

MyNewClass::MyNewClass() {
    AllMyFoos.push_back(this);
    //more stuff
}

次に、すべての子関数を反復してアクセスできます

//Non iter version because that stuff creeps me out
for (int i = 0; i < AllMyFoos.size(); i++ ) {
     AllMyFoos->SomeFunction() 
     //will access most derived function of SomeFunction() if you declared everything virtual.   
     //Either can be a base function or a derived function of MyNewClass.
}

これが私のやり方だと思いますが、それをサンプルコードに単純に挿入することはできず、それが可能かどうかわかりません。

于 2013-06-25T16:14:17.023 に答える