【问题标题】:The constructor take the parent class as argument构造函数将父类作为参数
【发布时间】:2018-10-17 06:55:17
【问题描述】:

我正在使用装饰器设计模式。装饰器继承自 Game 类,以游戏为参数。

    class Game {
       protected:
       int a;
       public:
       ~Game();
       Game(int a);
    };

    class Decorator : public Game{
       Game *m_game;
       public:
       Decorator(Game *game):m_game(game){}
    };

然后它返回错误:错误:“装饰器”的构造函数必须显式初始化没有默认构造函数的基类“游戏” 装饰器(游戏 *game):m_game(game){} ^

我该如何解决?

【问题讨论】:

  • 致电Game(int a)
  • 等一下,你的Decorator是一个游戏并且有一个游戏吗?
  • 你的“设计”看起来很可疑。你要么继承,要么包含。
  • 正如错误消息所说。 Decorator 的构造函数必须显式初始化其基类,即调用 Game 的构造函数。如果您没有在Decorators 初始化列表中显式调用这样的构造函数,编译器默认会寻找不接受任何参数的Game 构造函数。您的示例没有提供要调用的此类构造函数。
  • 在装饰器模式中,您不应该从具体的类类型继承,而只能从公开相关虚拟方法的基接口继承。装饰器将实现它们以执行您要添加的附加处理并将请求转发到在构造时传入的封闭具体实例。

标签: c++ decorator


【解决方案1】:

基类的构造函数需要一个参数。 这将有所帮助(将 0 替换为相应的值)。

Decorator(Game *game) : Game(0), m_game(game) {}

在 C++ 中,如果显式定义构造函数,编译器将不再生成隐式无参数构造函数。

【讨论】:

  • 这很可能是错误的解决方案。这是一个倒退。
  • 可以,但至少是他调查的起点。
  • 不是真的,不。
猜你喜欢
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多