gpt4 book ai didi

c++ - 类对象也管理树结构?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:41 25 4
gpt4 key购买 nike

我正在处理一个类层次结构,其中一个类的对象可能包含同一类的多个对象。这将导致树结构:

class myClass
{
myClass *parent;
std::vector<std::unique_ptr<myClass> > childs;

/*
* here are some more attributes which describe a myClass object
* but are not related to the tree structure.
* std::string name; for example
*/
public:
//constructors...
//tree management functions
//some more members...
}

但是,经过一段时间的思考,我认为这是一种不好的做法。在这种方法中,myClass 不仅需要拥有与其实际行为相关的成员,还需要拥有管理树的成员,例如搜索或插入子级。这将是一个类中的许多不同功能。而且,由于我们是懒惰的程序员,我不喜欢重新发明轮子。那里有一些树容器,例如著名的“tree.hpp”。为什么不使用这个容器来存储 myClass 对象?

嗯,问题是,myClass 的一些成员需要访问其父类。想象一个像 getFullName() 这样的成员函数,它不仅返回“名称”属性,还返回实际对象的完整路径(所有父项的名称)。因此,此函数需要遍历所有父节点,直到到达根节点。

我不确定如何使用 tree.hpp 或类似容器实现此目的。myClass 是否需要存储指向包含它的树节点的指针?但是我想不出一个例子,其中一个对象有关于包含它的容器的信息。一个类的对象不应该知道任何“被包含”。还是我错了?也许我的第一种方法(myClass 也进行树管理)还可以吗?

好吧,也许我应该问一个更简单的问题:让对象知道自己在容器中的位置的好方法是什么,例如一颗树?让对象访问其父对象而不在对象本身中存储太多(冗余)信息的好方法是什么?

最佳答案

首先,这是错误的:

class myClass
{
myClass *parent;
std::vector<std::unique_ptr<myClass> > childs;
};

您的 child 应该存储为 shared_ptr 的 vector ,而父应该是 weak_ptr

class myClass
{
std::sweak_ptr<myClass> parent;
std::vector<std::shared_ptr<myClass> > children;
};

不过,看起来你想要的是一个模板树容器。所以你的类应该是这样的:

class myClass
{
/*
* here are some more attributes which describe a myClass object
* but are not related to the tree structure.
* std::string name; for example
*/
public:
//constructors...
//tree management functions
//some more members...
};

树容器应该是这样的(概念上):

template <typename T>
class tree
{
std::sweak_ptr<tree> parent;
std::vector<std::shared_ptr<tree> > children;

T value;
};

这棵树可以是通用的并包含不同类型的对象,包括 myClass

关于c++ - 类对象也管理树结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22294024/

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