检查已创建的结构成员的实例

Check instance of struct member already created

本文关键字:成员 实例 结构 检查 创建      更新时间:2023-10-16

我目前被困在一个非常具体的问题。我有一个map结构,如:

std::map<int, MyStruct> myMap;
typedef struct
{
    long a;
    int b;
    MyObject* object;
} MyStruct;

在结构体创建时,object总是被设置为nullptr:

void createNewStruct(int id)
{
    MyStruct newStruct{2L, 1, nullptr}; // create with no object
    myMap.insert(std::pair(id, newStruct)); // store in map
}

我这样做是因为我可能在map中有数千个结构体,但只有少数可能需要一个本身相当大的实际"对象"。

object本身有一个有限的生命周期,如果当前没有显示,它应该显示,如果当前显示,则不显示。如果达到对象生命周期的结束,它调用stopped(this):

void doShow(int id)
{
    if(myMap[id].object == nullptr)
    {
        MyObject* newObject = new MyObject();
        connect(object, SIGNAL(stopped(MyObject*), this, (objectStopped(MyObject*)); // create callback to delete object later
        myMap[id].object = newObject;
        // do something with object
    }
}

现在如果stopped(this)被调用,我试着清理:

void objectStopped(MyObject* object)
{
    // do something with object
    delete object;
    object = nullptr; //????
}

但很明显,这并没有像预期的那样工作,因为nullptr的检查将永远不会再为真。

所以我想要实现的是:我有一个map与很多结构体,但只有少数这些结构体需要object。如何正确创建和删除该对象?

如果您有c++ 11编译器(您应该有),您可以使用id:

connect(object, 
        SIGNAL(stopped(MyObject*), 
        this, 
        []() { delete myMap[id]; myMap[id] = nullptr; });

我认为实现这一目标的最好方法是给予MyStruct所有权 MyObject,而不是使用外部函数来管理该分配。如果你这样做了,你的设计就会得到改善。

例如,你可以给MyStruct一些函数来管理MyObject结构的创建:createObject()创建一个,或者destroyObject()销毁它,一个函数来检查对象是否存在,你可以给MyStruct他自己的doShow()成员函数,所以你的外部doShow(int id)函数将获得正确的MyStruct为特定的'id',然后将调用MyStruct::doShow()不再。当你销毁一个MyStruct对象时,它也会自动释放它的MyObject,如果有的话,不用担心它会回调,信号/插槽机制等。

所以,底线:我只是让MyStruct对象更智能,并给它完整的所有权MyObject类。