Как использовать закрытую статическую переменную-член абстрактного типа - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь объявить закрытую статическую переменную-член абстрактного типа.Код:

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, чтобы сделать класс неабстрактным, но я не хочу этого делать.

1 Ответ

0 голосов
/ 10 февраля 2019

Вы не можете создать экземпляр абстрактного класса.Вы должны извлечь класс из него и переопределить чисто виртуальные методы.Затем вы можете создать экземпляр этого производного класса и использовать созданный экземпляр для инициализации ссылки на абстрактный класс:

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;
...