检查已创建的结构成员的实例
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
本身有一个有限的生命周期,如果当前没有显示,它应该显示,如果当前显示,则不显示。如果达到对象生命周期的结束,它调用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
类。
- 静态数据成员模板专用化的实例化点在哪里
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- C++初始化类实例时隐式调用类成员的构造函数
- 受约束的成员函数和显式模板实例化
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 访问同级类实例的成员
- static_assert私有类成员的类型,没有实例
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 实例化多种类型的成员函数模板
- 清除具有已删除赋值运算符的成员的类实例
- 依赖于类成员属性的类实例成员
- 力模板静态成员实例
- C 中的成员实例如何构建
- 使用向量<向量>成员实例化对象时的隔离错误<int>
- 具有静态成员实例的单一实例
- 一个类不能有自己的静态 constexpr 成员实例吗?
- 静态成员与静态常量成员实例化 - 有什么区别?
- 使用静态成员实例的 C++ 中的线程安全单一实例(无延迟实例化)
- 显式类成员实例化
- 带有自身静态const成员实例的c++模板类