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

Check instance of struct member already created

我目前遇到了一个非常具体的问题。我有一个 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",它本身就非常大。

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 .如何正确创建和删除这个对象?

我认为实现此目标的最佳方法是将 MyObject 所有权 授予 MyStruct,并且不使用外部函数来管理该分配. 如果这样做,您的设计总体上会有所改进。

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

所以,底线:我只是让 MyStruct 对象更聪明,并赋予它 MyObject [=37] 的完整 所有权 =].我相信这会改进整体设计。

如果你有一个 C++11 编译器(你应该有),你可以使用 id:

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