在现代C ++中传递指针结构在技术上是否正确?

时间:2017-08-07 10:34:02

标签: c++ pointers

我有一个使用Qt进行逻辑和GUI的C ++程序。随着程序的发展,我发现GU​​I需要很多指针通信。我想有一个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};

这种方法在技术上是否可以接受?这有点矫枉过正吗?是否有我可能忽略的角落案件?有什么替代方案?

1 个答案:

答案 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完全在firstObjectsecondObject等生命周期内使用时,会使用此功能,并将其作为neccecary传递