检查已创建的结构成员实例
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; });
我目前遇到了一个非常具体的问题。我有一个 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; });