【问题标题】:Using friends with base classes for Boost Parameter将朋友与基类一起用于 Boost 参数
【发布时间】:2009-09-07 01:21:33
【问题描述】:

我正在使用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 Parameter 库? 操作系统:Windows XP Pro,编译器:Visual C++ 2008 Express,Boost:1.39.0

【问题讨论】:

    标签: c++ boost constructor boost-parameter


    【解决方案1】:

    我认为我们需要清理一下。

    1. 朋友声明似乎不合适,从您希望 CGconstructor_base 能够访问 CardGenerator 属性的评论中:如果是这样,那么朋友声明进入 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 {};
    

    我确实想知道为什么 boost 选择了“继承”而不是(我认为)更简洁的组合。滥用继承要容易得多(并且需要多重继承)...不过我想它值得一个自己的主题。

    【讨论】:

    • 谢谢!我不敢相信我搞砸了朋友声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2011-08-10
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2012-12-04
    • 2012-04-10
    相关资源
    最近更新 更多