2012-09-18 42 views
0

我有要求包含類中的同一類的指針(類似鏈接列表,包含指向下一個鏈接的指針)。什麼我的要求是這樣的:包含同類類型的實例的類

class A 
    { 
     class A* child; 
    } 

我想確保A->兒童安全>的孩子將永遠是NULL,沒有人可以改變這一點。 (確保鏈接列表不超過兩個節點)。

任何幫助?

+0

你的意思是說具有'A'對象的代碼應該能夠得到子對象 - 但不是孫子? –

+0

我的意思是代碼應該能夠改變子代(當A被實例化時它將是NULL,但不是它的子代的子代(當我們創建第一個子代時它也是空的) – Agrawal

+1

這是一個「我怎麼做一些奇怪的事情來解決我的問題」 - 我們正在討論這個奇怪的事情,而不是你的實際問題。對我來說,因爲你希望層次結構的每個層次表現根本不同,你應該使用不同的類 – tenfour

回答

0

它不能做,不使用單鏈路反正:

你可以通過編程像強制執行限制。如果您有一個指向「父」的鏈接,則可以通過將childparent成員變量設爲私有,然後使用特殊訪問功能來確保您不能向鏈中的第一個對象添加多於兩個的鏈接。

我建議使用「父」鏈的原因是因爲您可以強制鏈中的第一個對象檢查它是否爲child鏈,但如果您有權訪問例如「鏈中的最後一個對象可以添加另外兩個該鏈中的孩子。

+0

所以基本上,如果我將有一個父鏈接,我可以檢查..如果父母是NULL它可以有一個孩子,如果父母是不是NULL,它不能有一個孩子。我想這會做。 – Agrawal

3

這樣的限制會很尷尬(如果可能的話)。我會用一個固定長度的數組,而不是去:

A* l[3]; 

,如果你需要,以防止切片,或者乾脆

A l[3]; 

否則。

class A 
{ 
    A* child; 
public: 
    void addChild(A* newChild) 
    { 
     if (child == NULL) 
      child = newChild; 
     else if (child->child == NULL) 
      child->child = newChild; 
     else 
      throw std::exception("list is already at full capacity"); 
    } 
} 
+0

當我打電話給addChild時,我將不得不創建一個newChild作爲參數傳遞,我現在要確保的是這個newChild-> chil d將始終爲NULL,現在沒有人可以在此對象上調用addChild(或調用將返回錯誤)。所以從你的解決方案來看,它不能確保我是否會在子對象而不是父對象上調用它。 – Agrawal

+0

@Agrawal所以...爲'newChild'添加一個額外的支票...... –