【问题标题】:C++ calling base class constructor inside child classC++在子类中调用基类构造函数
【发布时间】:2014-11-08 15:23:27
【问题描述】:

来自Java 我对调用基类构造函数(或super())有点困惑。 我有 2 个类:Player(抽象类)和 HumanPlayer,它是 Player 的子级。 现在,我有一个带有声明的 Player 构造函数:

Player(string name, list<Point> points);

现在我正在尝试实现这种类型的东西:

HumanPlayer() {
    string name = get name from user...
    list<Point> points = get points from user...
    ...
    ...
    ...
    super(name, points);
}

对 C++ 来说真的很陌生,很难使用它的语法。 问候,

【问题讨论】:

  • 请查看this question。它应该为您提供正确的语法。
  • 我做到了。但它迫使我在实现子构造函数之前调用超级构造函数。对我没有帮助
  • 不完全确定,但你能用Player(name, points);代替super()吗?
  • 没有。玩家是抽象的。
  • 您通常不会在构造函数中从用户那里收集数据,尤其是在无参数构造函数中。当您将对象添加到 STL 容器时,会发生各种有趣的事情。

标签: c++ inheritance constructor super base


【解决方案1】:

初始化派生类的基类的唯一方法是在构造函数的初始化列表中。那是冒号之后,函数体之前的东西。没有其他正常方法可以做到这一点。

HumanPlayer() :
        Player("...", list_of_points)
{
...
}

如果你真的必须在构造函数的主体中初始化基,而不是在列表中,你必须修改你的代码——例如通过在基类中引入一个“initialize()”函数或使用“pimpl 成语”。

【讨论】:

  • “你必须修改你的代码——例如通过在基类中引入一个“initialize()”函数或使用“pimpl idiom”。 ...或修复您的设计。
【解决方案2】:

如果“get name from user...”和“get points from user...”位非常简单,可以实现为简单的表达式或函数调用:

HumanPlayer()
   : Player( "get name from user... code",
             "get points from user... code")
{


}

另一方面,如果两个“get”位都是不平凡的,并且相互依赖,那么这会有点复杂。类似这样的典型方法的简要概述:

class HelperClass {

public:

    std::string name;
    std::list<Point> points;

    HelperClass()
    {
         // The constructor here will do whatever is needed to initialize name and points
    }
};


// ...

HumanPlayer(const HelperClass &helper=HelperClass())
 : Player(helper.name, helper.points)
{
}

有些人可能会觉得这有点骇人听闻:滥用默认参数值来实例化构造函数中使用的对象。但它有效。如果使用至少支持 C++11 标准的 C++ 编译器,这可以通过不同的方式做得更好。

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 2012-09-28
    • 2013-03-24
    • 2015-08-18
    • 2014-02-19
    • 1970-01-01
    • 2020-11-28
    • 2016-07-19
    • 2018-03-31
    相关资源
    最近更新 更多