【问题标题】:Construct object without arguments where superclass requires arguments在超类需要参数的情况下构造不带参数的对象
【发布时间】:2014-05-29 16:40:35
【问题描述】:

我正在实现一个继承自超类的类。超类的构造函数需要参数。我希望子类无需参数即可实例化。超类如下所示:

class OtherClass {
public:
    OtherClass(YetAnotherClass *yac);
};
class SuperClass {
public:
    SuperClass(OtherClass *c);
};

我想做这样的事情:

class MyClass : public SuperClass {
public:
  MyClass() : SuperClass(OtherClass(YetAnotherClass)) {}
};

为了避免在实例化MyClass的成员时不得不做这样的事情:

YetAnotherClass * only_used_once = YetAnotherClass();
OtherClass * also_used_just_once = OtherClass(only_used_once);
MyClass what_i_actually_want = MyClass(also_used_just_once);

这可能吗? A similar question 展示了创建静态方法的解决方案,该方法生成父构造函数所需的参数,但我希望有更简单的方法来实现。

【问题讨论】:

  • 为什么你的构造函数使用指针参数?
  • 因为它们不是我的 ;) 当不需要通过副本时,我也更喜欢参考。
  • Superclass 是 javaspeak,由于多重继承,在 C++ 中没有意义。尝试改用基类派生类。当您了解initializer lists 时,您的问题也可能会消失。
  • @initializer:“基类”如何比“超类”更合适?如果有人说“A 类有超类 B1 和 B2”之类的话,会不会造成麻烦?

标签: c++ inheritance constructor


【解决方案1】:

与:

struct DataClass
{
    DataClass() : yetAnotherClass(), otherClass(&yetAnotherClass) {}

    YetAnotherClass yetAnotherClass;
    OtherClass otherClass;
};

如果MyClass 的每个实例都拥有另一个类,您可以执行以下操作:

class MyClass : private DataClass, public SuperClass
{
public:
  MyClass() : DataClass(), SuperClass(&this->otherClass) {}
};

否则他们共享其他课程,您可以这样做:

class MyClass : public SuperClass
{
public:
    MyClass() : SuperClass(&dataClass.otherClass) {}
private:
    static DataClass dataClass;
};

DataClass MyClass::dataClass;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2018-06-09
    相关资源
    最近更新 更多