Невозможно вызвать функцию-член 'virtual void' без объекта - PullRequest
0 голосов
/ 26 марта 2020

Есть ли способ вызвать функцию pure () из функции вложенного класса?

G ++ выдает ошибку: не может вызвать функцию-член 'virtual void Outer :: pure ()' без объекта.

Я не знаю, что делать.

  class Outer 
    {
    public:  
        class Nested
        {
        public:
            void function();
        };

    public:
        void print();
        virtual void pure() = 0;
    };

    void Outer::print() {
            printf("Hello! This is a test prgoram.\n");
        }

    void Outer::Nested::function()
    {
        Outer::pure();         // !!!!!! cannot call member function ‘virtual void Outer::pure()’ without object
        printf("Function\n");
    }

class D : Outer {
public:    
    void pure() override {
        printf ("pure\n");
    }

    void d_function() {
        printf ("d_function\n");
        print();
    }
};

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

К сожалению, такое использование невозможно: - /.

Я не могу позвонить:

Outer outer;

Класс Outer имеет виртуальную пустоту Outer :: pure ().

Мои ошибки:

main.cpp: In function ‘int main()’:
main.cpp:130:11: error: use of deleted function ‘Outer::Outer()’
     Outer outer;
           ^~~~~
main.cpp:81:7: note: ‘Outer::Outer()’ is implicitly deleted because the default definition would be ill-formed:
 class Outer
       ^~~~~
main.cpp:81:7: error: no matching function for call to ‘Outer::Nested::Nested()’
main.cpp:87:13: note: candidate: Outer::Nested::Nested(Outer&)
             Nested(Outer& outer) : outer{outer} {}
             ^~~~~~
main.cpp:87:13: note:   candidate expects 1 argument, 0 provided
main.cpp:84:15: note: candidate: constexpr Outer::Nested::Nested(const Outer::Nested&)
         class Nested
               ^~~~~~
main.cpp:84:15: note:   candidate expects 1 argument, 0 provided
main.cpp:84:15: note: candidate: constexpr Outer::Nested::Nested(Outer::Nested&&)
main.cpp:84:15: note:   candidate expects 1 argument, 0 provided
main.cpp:130:11: error: cannot declare variable ‘outer’ to be of abstract type ‘Outer’
     Outer outer;
           ^~~~~
main.cpp:81:7: note:   because the following virtual functions are pure within ‘Outer’:
 class Outer
       ^~~~~
main.cpp:99:22: note:   virtual void Outer::pure()
         virtual void pure() = 0;
0 голосов
/ 27 марта 2020

Чтобы вызвать вашу виртуальную функцию-член 'pure', вам нужен экземпляр 'D'. Существует скрытый скрытый параметр (это). Вы не можете вызвать функцию, не передав ей необходимые параметры.

Вы можете добавить параметр в Nested :: function:

class Nested
{
public:
    void function(Outer& outer)
    {
        outer.pure();
    }
};

Или можете сохранить ссылку:

class Nested
{
public:
    Nested(Outer& outer) : outer{outer} {}
    void function()
    {
        outer.pure();
    }
private:
    Outer& outer;
};

Для второй версии вы можете предоставить заводскую функцию:

class Outer
{
public:

    class Nested
    {
    public:
        Nested(Outer& outer) : outer{outer} {}
        void function()
        {
            outer.pure();
        }
    private:
        Outer& outer;
    };

    virtual void pure() = 0;

    auto make_nested()
    {
        return Nested{*this};
    }
};

Использование:

class Derived : public Outer
{
public:
    void pure() override
    {
        printf ("pure\n");
    };
};

int main()
{
    Derived derived;
    auto nested = derived.make_nested();
    nested.function(); // calls pure

    return 0;
}
...