2009-09-07 62 views
0

我使用Boost Parameter教程爲撲克牌生成器創建了命名參數構造函數。本教程說將ArgumentPack放入基類,但我想修改卡片生成器類中的變量。我也想過這樣做:使用具有基類的朋友進行Boost參數

class CGconstructor_base { 
public: 
     template<class ArgumentPack> 
     CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code 
     in this function */ 
     friend CardGenerator;//so it can modify the variables of CardGenerator 
} 
class CardGenerator:public CGconstructor_base; 

這是法律還是有更好的方式來操縱CardGenerator私有變量,並使用提升參數庫? 操作系統:Windows XP專業版,編譯器:Visual C++ 2008 Express,Boost:1.39.0

回答

1

我認爲我們需要一些清理。

  1. friend聲明似乎不適放置,從評論你想CGconstructor_base能夠訪問CardGenerator屬性:如果是這樣,那麼friend聲明進入CardGenerator(我說,我認爲誰是我的朋友,你不要宣稱自己是我認爲的朋友)。

  2. 爲什麼你還需要朋友?如果在教程中使用了一個結構,然後將屬性填充到CGconstructor_base中,那將會好很多。這樣,您就可以自然地從CardGenerator訪問它們,而無需使用此補充線。當你沒有「朋友」關鍵字時,你應該(通常要注意:如果這樣做不會增加成本太多)。

  3. 你想PRIVATE在這裏繼承,這是一個詳細的實現。只有當其他類/方法需要知道使用你作爲一個基礎時,才使用公有繼承(或甚至保護)。

一言以蔽之:

struct CGconstructor_base { 
     template<class ArgumentPack> 
     CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code 
     in this function */ 

     cg_type1 cg_attr1; 
     cg_type2 cg_attr2; 
}; // don't forget this 

class CardGenerator:private CGconstructor_base {}; 

我不知道爲什麼「繼承」已被提升,而不是(我認爲)清洗組合選擇。濫用繼承是非常容易的(並且需要多重繼承)......我認爲它是值得自己的主題。

+0

謝謝!我不敢相信我搞砸了朋友的聲明。 – mmoran