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 中,声明一个静态向量 base* 指针,您将始终在构造函数中 push_back。然后当你想迭代对象时,你可以迭代指针。

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

在你的 .cpp 中不要忘记初始化。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 回答