如果我有几个级别的对象包含(一个对象定义并实例化另一个定义并实例化另一个对象的对象..),是否可以访问upper,包含 - 对象变量和函数,拜托?
示例:的
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;
但是,在编译并运行我的应用程序后,我收到 内存访问冲突错误 。
答案 0 :(得分:1)
也许所有对象都可以从以下公共接口继承:
class MyObject
{
public:
virtual int getData() = 0;
}
然后你可以使用stl库中的std :: tree来构建你的结构。
答案 1 :(得分:1)
当您传递指向容器对象的指针时,此指针有时称为后退指针。我看到这种技术一直在GUI库中使用,其中窗口小部件可能希望访问其父窗口小部件。
话虽如此,您应该问自己是否有更好的设计不涉及循环依赖(在容器依赖于容器且容器取决于容器的意义上的循环)
您严格必须动态创建对象才能使后向指针技术正常工作。您始终可以获取堆栈分配(或静态分配)对象的地址。 只要该对象的生命持续存在,而其他对象使用它的指针。但实际上,这种技术通常用于动态创建的对象。
请注意,您也可以使用反向引用而不是后向引用。
我想我知道是什么导致了您的细分错误。当您的向量重新分配其内存时(由于增长到更大的大小),旧向量元素的地址将变为无效。但是这些对象的孩子(和孩子们)仍然在他们的后卫中保留旧地址!
要使后向指针工作,你必须动态分配每个对象并将它们的指针存储在向量中。这会使内存管理变得更加混乱,因此您可能希望使用智能指针或boost :: ptr_containers。
在看到你在另一个答案中做出的评论之后,我现在对你想要完成的事情有了更好的了解。您应该研究通用树结构和复合模式。复合模式通常是我之前引用的小部件示例中使用的。
答案 2 :(得分:0)
正如Emile所说,分段错误是由重新分配引起的。确切地说 - 当本地堆栈对象&#39; &#39;这&#39;传递指针以创建另一个对象,然后将其复制到向量容器中。然后&#39;创建()&#39;函数退出时,堆栈框架对象不再存在,容器中的指针无效。