【问题标题】:How to use private static member variable of abstract type如何使用抽象类型的私有静态成员变量
【发布时间】:2019-07-04 08:12:08
【问题描述】:

我正在尝试声明一个抽象类型的私有静态成员变量。代码:

class AbstractClass{
public:
    virtual double operator()() = 0;
};

class ThisOneContainsIt{
private:
    static AbstractClass var; //this does not work
    static AbstractClass & var; //this seems to work, but...
}

//my .cpp
AbstractClass & ThisOneContainsIt::var; //...this does not work either

现在我的想法已经用完了。我很确定这一定是可能的 - 我总是可以删除 = 0 以使课程非抽象,但这不是我真正想做的。

【问题讨论】:

  • 你必须初始化引用。你想达到什么目的?
  • “不起作用”是什么意思?
  • XY 问题?你到底想达到什么目标?
  • 名为 AbstractClass 的抽象类不能被实例化,因为它是抽象的。因此,当您尝试实例化它时,编译器会报错。
  • 您可以声明一个指向AbstractClass 的指针并将其初始化为空(这几乎是这里唯一的选择)。请注意,ThisOneContainsIt 也是抽象的,因为您没有覆盖基类的纯函数,因此尝试实例化它也会失败。

标签: c++ static private abstract


【解决方案1】:

您不能实例化抽象类。您必须从中派生一个类并覆盖纯虚拟方法。然后您可以实例化该派生类,并使用创建的实例来初始化您的抽象类引用:

class AbstractClass
{
    public:
        virtual double operator()() = 0;
};

class DerivedClass : public AbstractClass
{
    public:
        double operator()() override { return 0.0; }
};

class ThisOneContainsIt
{
    private:
        static DerivedClass d;

        static AbstractClass &var;
};

DerivedClass ThisOneContainsIt::d; 

AbstractClass &ThisOneContainsIt::var(d);

不过,我不知道你为什么想做这样的事情。你不妨这样做:

class ThisOneContainsIt
{
    private:
        static DerivedClass var;
};

DerivedClass ThisOneContainsIt::var;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2012-01-02
    • 1970-01-01
    • 2021-08-30
    • 2011-07-30
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多