嵌套数据结构,其中子级从父级继承数据

Posted

技术标签:

【中文标题】嵌套数据结构,其中子级从父级继承数据【英文标题】:Nested data structure where children inherit data from parent 【发布时间】:2016-08-01 13:58:12 【问题描述】:

我正在尝试创建一个嵌套的数据结构,它有很多层,每个“孩子”都可以从他们的父母/祖父母/等处访问数据......

以这些数据结构为例:

struct GrandChild 
    int someGrandChildData;
;
struct Child 
    int someChildData;
    std::vector<GrandChild> vgrandChild;
;
struct Parent 
    int someParentData;
    std::vector<Child> vchild;
;
struct GrandParent 
    int someGrandParentData;
    std::vector<Parent> vparent;
;

我希望访问数据的方式是这样的:

void main()

    // create and fill in the data
    GrandParent gp;
    for (int pNum = 0; pNum < 3; pNum++)
    
        gp.vparent.push_back(Parent());
        for (int cNum = 0; cNum < 3; cNum++)
        
            gp.vparent[pNum].vchild.push_back(Child());
            for (int gcNum = 0; gcNum < 3; gcNum++)
            
                gp.vparent[pNum].vchild[cNum].vgrandChild.push_back(GrandChild());

                // call function and ONLY pass a GrandChild
                func(gp.vparent[pNum].vchild[cNum].vgrandChild[gcNum]);
            
        
    


void func(GrandChild &gc)

    int result = gc.someGrandChildData;

    // no need to pass GrandParent, Parent, or Child because
    // GrandChild can access all of the data from them
    result += gc.someChildData; // <<-- how can I achieve something like this
    result += gc.someParentData; // <<-- how can I achieve something like this
    result += gc.someGrandParentData; // <<-- how can I achieve something like this

我正在尝试这样做,因为我在每个嵌套层都有包含许多数据成员的结构,当我调用函数时,必须将大量参数传递给每个函数调用并且变得一团糟以保持井井有条是非常烦人的。

任何帮助将不胜感激。

【问题讨论】:

你想过使用多态性和虚函数吗? 我想过,但就是不知道怎么做。之前用过一些多态和虚函数,但不是很精通。 【参考方案1】:

您可以通过跟踪每个人的父母(我们称之为节点)来做到这一点。因此,对于每个节点,在其中创建其直接父级的对象,并为每一层(GrandChild、Child、Parent.. 等)执行此操作。

所以每个GrandChild 将有一个Child 对象,每个Child 将有一个Parent 对象,每个Parent 将有一个GrandParent 对象。

然后你就可以做这样的事情了:

void func(GrandChild &gc)

    int DataFromTheGranChild  = gc.DataFromGrandChild;
    int DataFromTheChild      = gc.Child.DataFromChild;
    int DataFromTheParent     = gc.Child.Parent.DataFromParent;
    int DataFromTheGradParent = gc.Child.Parent.GrandParent.DataFromGrandParent;

    //..

【讨论】:

好的,补充一点信息:GrandParent 和 Parent 级别的数据可能会在创建后更新。发生这种情况时,我希望 Child 和 GrandChild 也能得到更新。我希望我必须将每个直接父级的引用传递给每个子级。这会成为使用向量的问题吗? 如果我理解你的问题,你可以先试试。这应该不是问题。每当发生更改时,只需按照您已经执行的方式迭代向量并为每个孩子、孙子等提交更改。【参考方案2】:

你可以尝试只使用一种类型的结构。

struct Entity
    int Data;
    Entity* Child;
    Entity* Parent;
;

【讨论】:

你的结构尺寸是多少?我的意思是你应该使用某种指针。

以上是关于嵌套数据结构,其中子级从父级继承数据的主要内容,如果未能解决你的问题,请参考以下文章

javascript中子窗口如何从父窗口继承css样式?

有办法去掉从父级元素继承下来的 CSS 样式吗

嵌套类型未从父级接收用户输入

从父级访问子类属性[关闭]

不从父级继承的 Spring Cloud 配置云

Delphi中子窗体如何继承父窗体