2016-08-01 74 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