如果我有多个级别的对象包含(一个对象定义并实例化另一个对象,该对象定义并实例化另一个对象..),是否可以访问包含对象变量和函数的上层对象?

例:

    class CObjectOne
    {
    public:
       CObjectOne::CObjectOne() { Create(); };

       void Create();

       std::vector<ObjectTwo>vObejctsTwo;
       int nVariableOne;
    }
    bool CObjectOne::Create()
    {
       CObjectTwo ObjectTwo(this);
       vObjectsTwo.push_back(ObjectTwo);
    }

    class CObjectTwo
    {
     public:
       CObjectTwo::CObjectTwo(CObjectOne* pObject)
       {
        pObjectOne = pObject;
        Create();
       };

       void Create();
       CObjectOne* GetObjectOne(){return pObjectOne;};

       std::vector<CObjectTrhee>vObjectsTrhee;
       CObjectOne* pObjectOne;
       int nVariableTwo;
    }
    bool CObjectTwo::Create()
    {
       CObjectThree ObjectThree(this);
       vObjectsThree.push_back(ObjectThree);
    }

    class CObjectThree
    {
     public:
       CObjectThree::CObjectThree(CObjectTwo* pObject)
       {
        pObjectTwo = pObject;
        Create();
       };

       void Create();
       CObjectTwo* GetObjectTwo(){return pObjectTwo;};

       std::vector<CObjectsFour>vObjectsFour;
       CObjectTwo* pObjectTwo;
       int nVariableThree;
    }
    bool CObjectThree::Create()
    {
       CObjectFour ObjectFour(this);
       vObjectsFour.push_back(ObjectFour);
    }

main()
{
    CObjectOne myObject1;
}


说,从CObjectThree内部,我需要在CObjectOne中访问nVariableOne。我想这样做如下:

int nValue = vObjectThree[index].GetObjectTwo()->GetObjectOne()->nVariable1;


但是,编译并运行我的应用程序后,出现内存访问冲突错误。


上面的代码有什么问题(这是示例,可能包含拼写错误)?
我必须动态创建对象而不是静态创建对象吗?
还有什么其他方法可以从包含对象中获取存储在包含对象中的变量?

最佳答案

当您传递指向容器对象的指针时,该指针有时称为反向指针。我看到该技术在GUI库中一直被使用,而在GUI库中,小部件可能要访问其父小部件。

话虽这么说,您应该问自己是否有一个更好的设计,该设计不涉及循环依赖项(就循环而言,容器取决于容器,容器取决于容器)。

您不必严格地动态创建对象即可使后向指针技术起作用。您始终可以获取堆栈分配(或静态分配)对象的地址。只要该对象的生命持续存在,而其他对象正在使用指向它的指针。但实际上,此技术通常用于动态创建的对象。

请注意,您也许还可以使用向后引用而不是向后指针。



我想我知道是什么导致您的细分错误。当向量重新分配其内存时(由于增大为更大的大小),旧向量元素的地址将变为无效。但是这些对象的子代(和子代子代)仍将旧地址保留在其后指针中!

为了使后向指针起作用,您必须动态分配每个对象并将其指针存储在向量中。这会使内存管理更加混乱,因此您可能要使用智能指针或boost :: ptr_containers。



在看到您在另一个答案中发表的评论后,我现在对您要完成的工作有了更好的了解。您应该研究通用树结构和复合模式。我以前引用的小部件示例通常使用复合模式。

关于c++ - 从包含的对象访问包含对象的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5229482/

10-11 22:29
查看更多