gpt4 book ai didi

c++ - 亲子计划

转载 作者:行者123 更新时间:2023-11-30 01:00:17 25 4
gpt4 key购买 nike

我正在编写一个类,它包含一个指向相同类型的父对象的指针(想想 Qt 的 QObject 系统)。每个对象都有一个父对象,当子对象被销毁时,父对象不应被销毁(很明显)。

class MyClass
{
public:
MyClass(const MyClass* ptr_parent): parent(parent){};
~MyClass(){ delete[] a_children; };
private:
const MyClass* ptr_parent; // go to MyClass above
MyClass* a_children; // go to MyClass below
size_t sz_numChildren; // for iterating over a_children
}

(请原谅我的内联编码,这只是为了简洁)

摧毁“Master MyClass”会照顾到所有的 child 吗?没有 child 应该能够杀死它的 parent ,因为这样我的主程序中就会有指向被销毁对象的指针,对吗?

你为什么会问?我需要一种方法来“遍历”所有子目录并在平台独立级别上查找所有文件。这棵树的创建将由 native API 处理,其余的则不会。这是一个好主意吗?

谢谢!

最佳答案

这个概念很好,但是你发布的代码有很多问题(尽管我从你关于“内联编码”的评论中了解到你只是即时编写而不是从可编译程序中复制它).

  1. 您需要 a_childrenMyClass 的数组指针,所以它需要有类型 MyClass** ,您将需要分配它并在添加子项时适本地重新分配它。

  2. delete[] a_children不会删除 child ,它会删除保存指向 child 的指针的数组。你必须在 MyClass析构函数,遍历数组,删除每个子指针,然后删除数组。事实上,使用 std::vector<MyClass*> 可能是更好的主意。对于 a_children而不是 MyClass* ,所以您不必担心 (1)。但即使使用 vector ,您仍然需要迭代并删除析构函数中的每个子项。

  3. 您的 child 需要以某种方式向他们的父对象“注册”。按照你写这个的方式,子对象无法告诉父对象它存在。出于这个原因,您可能无法通过传递 const 父指针。

举个例子:

class MyClass {

public:

MyClass(MyClass* parent)
: m_parent(parent)
{
if (m_parent) m_parent->registerChild(this);
}

~MyClass()
{
for (std::vector<MyClass*>::const_iterator i = m_children.begin();
i != m_children.end(); ++i)
{
delete *i;
}
}

void registerChild(const MyClass* child)
{
m_children.push_back(child);
}

private:

MyClass* m_parent;
std::vector<const MyClass*> m_children;
};

请注意,这没有考虑 child 将被除摧毁其 parent 以外的任何方式摧毁的可能性。

关于c++ - 亲子计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2859172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com