使用具有Boost参数的基类的朋友

时间:2009-09-07 01:21:34

标签: c++ boost constructor boost-parameter

我正在使用Boost Parameter教程为扑克牌生成器创建一个命名参数构造函数。该教程说将ArgumentPack放入基类,但我想修改卡生成器类中的变量。我考虑过这样做:

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中的私有变量并使用Boost参数库? 操作系统:Windows XP Pro,Compilier:Visual C ++ 2008 Express,Boost:1.39.0

1 个答案:

答案 0 :(得分:1)

我认为我们需要一些清理工作。

  1. 朋友声明似乎不合适,从你希望CGconstructor_base能够访问CardGenerator属性的评论:如果是这样,那么朋友声明进入CardGenerator(我说我认为谁是我的朋友,你没有宣称自己是我认为是朋友的人。

  2. 为什么你还需要朋友?如果在教程中你使用了一个结构然后将属性填充到CGconstructor_base中会好得多。通过这种方式,您可以自然地从CardGenerator访问它们而无需此补充线。当你没有“朋友”关键词时你应该这样做(通常需要注意:如果这样做不会增加太多的成本)。

  3. 您希望 PRIVATE 继承,这是一个详细的实现。只有当其他类/方法需要知道使用你'作为'基础时才使用公共继承(或甚至保护)。

  4. 简而言之:

    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 {};
    

    我确实想知道为什么'继承'是通过提升选择而不是(我认为)更清洁的成分。滥用继承(并且需要多重继承)要容易得多......我认为它值得一个自己的主题。