2009-11-09 95 views
0

我想知道什麼是最佳實踐。在同一類的兩個實例中傳遞(另一個類)(讓我們稱之爲「主」)。所以,基本上在第一個構造函數中,我可以初始化外部實例(讓我們稱之爲「Shared」),然後在main()中處理這個類時將其設置爲特定值。在實例中傳遞另一個類

所以'共享',可能是一個整數,現在說999。

現在如果我創建主類'Primary'的另一個實例呢?最好的方式來訪問已被初始化的'Shared'的外部實例 - 因爲如果我沒有正確處理這個問題,'Primary'的構造函數在再次調用時會繼續並創建一個'Shared'實例,因此我失去了價值999 ..我可以想到一些凌亂的解決方案涉及動態指針,如果聲明(只),但我有一種感覺可能有一個更簡單,更乾淨的解決方案?

+0

難以遵循......你能詳細說明一些代碼嗎? – fretje 2009-11-09 19:00:40

+1

你的問題很混亂。類不會被初始化;實例。你能否修改你的問題來更精確地使用「類」和「實例」這些術語? – 2009-11-09 19:00:46

+0

並儘量避免像「這個班級」這樣的詞彙。我無法分辨您是指外部班級還是班級的其他實例(無論他們是什麼)。 – 2009-11-09 19:04:16

回答

3

據我瞭解:

  • 你有A級
  • 你有一個B類
  • 對於所有A類成員有B類的單個實例

您沒有提到是否有來自A構造函數的參數用於初始化B!
用於B的第二個A的參數會發生什麼變化?
所以我們假定B是默認構造的。
我們還將假設您需要對B的實例進行懶惰評估,否則您只需使用靜態成員。

class A 
{ 
    B& bRef; 
    public: 
     A() 
      :bRef(getLazyB())  // Get a reference to the only B for your object. 
     {}      

    private: 
     static B& getLazyB() 
     { 
      static B instance; // Created on first use 
      return instance; // returned to all users. 
     } 
}; 
+0

謝謝你!真棒:) – oneAday 2009-11-09 19:11:46

+0

但是,這引入了一個單線程,將有線程和測試問題。你也不能發送參數給它的構造函數。這取決於你需要的細節 – Mark 2009-11-09 19:16:44

+0

@Mark:是的,這個絕對簡單的演示介紹了一個singelton。但在tdd環境中,將getLazyB()轉換爲工廠來生成appropraite對象本身很簡單。但我發現一次回答一個問題通常會更好。不要試圖一舉解釋整個C++。 – 2009-11-09 19:25:50

2

使構造函數獲取指向共享類的指針或引用。外部建設更容易。

class Shared; 

class Same 
{ 
    shared& shared_; 

    Same(Shared& s) { shared_ = s; } 
} 

隨着appropiate使用const和其他的構造等

+2

如果要引用共享類的實例,那麼需要解決的一件事就是所有權 - 誰負責清理「共享」對象實例?它是「Same」實例還是其他什麼?沒有一個正確的答案 - 但是這是共享設計時需要考慮的問題。 – 2009-11-09 19:06:49

+0

同意重新擁有。 – Mark 2009-11-09 19:14:57

0

這取決於你的類的語義。如果外部類不是真的在外面,而是恰好在實例之間共享的一些模糊的實現細節,則將第一個實例傳遞給第二個實例的構造函數,並在那裏獲取對外部實例的引用。

如果外部類真的是一個具有自身意義的外部類,那麼在外部創建它並將其傳遞給構造函數,就像Mark建議的那樣。

如果不只是兩個特定的實例,但所有實例都共享外部類的相同實例,請考慮將其設置爲類的靜態成員,正如Martin York所建議的那樣。