我有一个使用Qt进行逻辑和GUI的C ++程序。随着程序的发展,我发现GUI需要很多指针通信。我想有一个C ++结构,它包含一个指向所有需要传递的对象的指针,以便需要另一个对象的任何其他对象可以从这个指针结构中绘制。
struct ObjectPointers {
FirstObject *firstObject = shared_ptr firstClass;
SecondObject *secondObject = shared_ptr secondClass;
ThirdObject *thirdOjbect = shared_ptr secondClass;
...
}
需要其中一个对象的任何其他对象将执行以下操作;
// Initializing the ObjectPointers instance
ObjectPointers *ops = shared_ptr ObjectPointers;
// Initializing some random object instance
SomeNewOjbect sno{ops->secondObject};
这种方法在技术上是否可以接受?这有点矫枉过正吗?是否有我可能忽略的角落案件?有什么替代方案?
答案 0 :(得分:1)
您似乎对shared_ptr如何工作以及它的用途感到困惑。可能是因为尝试将Java / C#语义强加到C ++程序中。
我假设你的FirstObject
SecondObject
等都是在其他地方管理的长期存在的东西,比如顶级窗口及其数据结构。
struct ObjectPointers { FirstObject *firstObject = shared_ptr firstClass; SecondObject *secondObject = shared_ptr secondClass; ThirdObject *thirdOjbect = shared_ptr secondClass; ... }
首先,这不是c ++语法。 shared_ptr firstClass
是否意味着有<>
? FirstObject * firstObject
是指向FirstObject
类型的事物的(原始)指针,通常与firstClass
个实例完全无关。
这类似于默认初始化shared_ptr,然后将其分配给原始指针,这也是无效的,除非您的(非标准)shared_ptr提供对原始指针的默认转换。其净效果与在这些位置分配nullptr
相同。
要回答你的问题,拥有这样一个结构(有一堆&#34;尖头&#34;成员)本身并不坏,但是表明一个可以重做的架构,以至于很少的东西在任何一个地方都需要尽可能的。使用shared_ptr的细节也值得怀疑,因为它意味着你不知道这些对象的生命周期。
struct MyObjects {
MyObjects() :
firstObject(/* get firstObject from somewhere */),
secondObject(/* get secondObject from elsewhere */),
...
{}
FirstObject & firstObject;
SecondObject & secondObject;
...
}
当我知道MyObjects
完全在firstObject
,secondObject
等生命周期内使用时,会使用此功能,并将其作为neccecary传递