c++ - 从包含对象访问包含对象的成员

标签 c++ oop visual-c++ containment

如果我有多个对象包含级别(一个对象定义和实例化另一个对象,而另一个对象又定义和实例化另一个对象..),是否有可能访问上层,包含-对象变量和函数,好吗?

示例:

    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;

但是,在编译并运行我的应用程序之后,我得到了内存访问冲突错误

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

最佳答案

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

话虽如此,您应该问问自己是否有更好的设计不涉及循环依赖(循环的意思是容器依赖于容器,容器依赖于容器) .

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

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


我想我知道是什么导致了您的段错误。当你的 vector 重新分配它们的内存时(由于增长到更大的大小),旧 vector 元素的地址变得无效。但是这些对象的子对象(和孙对象)仍然在它们的反向指针中保留旧地址!

要使反向指针起作用,您必须动态分配每个对象并将它们的指针存储在 vector 中。这将使内存管理变得更加困惑,因此您可能希望使用智能指针或 boost::ptr_containers。


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

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

相关文章:

c++ - 函数模板 : typename declaration

javascript - JQuery AJAX 和 OOP JS 作用域问题

c++ - 取消引用临时 std::shared_ptr 是否安全?

c++ - 如何在 Visual C++ 中添加条件断点

c++ - Qt 接口(interface)类

c++ - 为什么 std::optional<int> 的构造比 std::pair<int, bool> 更昂贵?

c# - API 扩展中的对象链接与方法

java - Android在父类xml中声明textview并在子类中设置监听器

c++ - 理解 C++ 中的引用和拷贝的问题

c++ - 在 Android 上使用 Boost.Log 进行 logcat