2016-08-01 75 views
0

我试图创建一个嵌套的数据结构,是深许多层,其中每个“孩子”可以从他们的父母/祖父母/等访问数据的数据...嵌套数据结构,让孩子继承父

为例如拿这些数据结构:

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 
} 

我想这样做,因为我有马的结构每个嵌套层都有数据成员,当我调用函数时,必须将大量参数传递给每个函数调用并且变得乱七八糟以保持组织性,这是非常令人讨厌的。

任何帮助将不胜感激。

+0

你有没有关于使用多态和虚函数? – NathanOliver

+0

我曾经想过,但只是不知道该怎么做。我以前使用过一些多态和虚函数,但我并不十分精通。 – Stanton

回答

0

你可以通过跟踪每个人的家长(我们称之为节点)来做到这一点。因此,对于每个Node,在其内部创建其直接Parent的对象,并为每个图层(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; 

    //.. 
} 
+0

好的,添加一些信息:创建后可能会更新GrandParent和Parent级别的数据。我希望Child和GrandChild在发生这种情况时也能得到更新。我期望我不得不将每个直接父母的引用传递给每个孩子。这是否成为使用矢量的问题? – Stanton

+0

如果我正确理解你的问题,你可以先尝试一下。这应该不成问题。无论何时发生变化,只要按照您已经做的方式迭代矢量,并为每个孩子,孙子提交更改等。 –

0

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

struct Entity{ 
    int Data; 
    Entity* Child; 
    Entity* Parent; 
}; 
+0

您的结构的大小是多少?我的意思是你应该使用某种指针。 – Jarod42