如何将分配给*Child[n]的*Base指向Child数组的下一个元素

How to have a *Base assigned to *Child[n] point to the next element of the Child array?

本文关键字:Child Base 指向 元素 下一个 数组 分配      更新时间:2023-10-16

我有这个[不完整]函数:

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。

好吧,也许这对你不起作用,但它让我想起了在学校迭代数据结构。通常,我会在类中声明一个类指针成员。既然您想指出的不仅仅是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.
}

我想我会这样做,但我不能简单地将其注入到您的示例代码中,也不知道这是否可能。