функция — C ++ отправляет производный указатель в качестве аргумента

Я пытаюсь отправить производный указатель на функцию базового класса через другую функцию базового класса, но по какой-то причине он жалуется:
ошибка: неверное использование неполного типа ‘struct Derived’ в строке 8.

#include <iostream>
using namespace std;
class Derived;

class Base
{
public:
void getsomething(Derived *derived){derived->saysomething();} //This is line 8
void recieveit(Derived *derived){getsomething(&*derived);}
};

class Derived : public Base
{
public:
void giveself(){recieveit(this);};
void saysomething(){cout << "something" << endl;}
};int main()
{
Base *b = new Base;
Derived *d = new Derived;
d->giveself();
return 0;
}

ты знаешь как я мог это исправить?

1

Решение

Вы не можете использовать предварительное объявление, когда компилятору нужна информация о членах класса.

Предварительное объявление полезно только для сообщения компилятору о том, что класс с таким именем существует и будет объявлен и определен позже.

Так что сделайте как следующее:

class Derived ;

class Base
{
public:
void getsomething(Derived *derived);
void recieveit(Derived *derived);
};

class Derived : public Base
{
public:
void giveself(){recieveit(this);};
void saysomething(){cout << "something" << endl;}
};

void Base::getsomething(Derived *derived){derived->saysomething();}
void Base::recieveit(Derived *derived){getsomething(&*derived);}
1

Другие решения

Единственный способ — извлечь определения функций из объявления класса и поместить их после объявления Derived, В тот момент, когда вы пытаетесь их использовать, плохой компилятор даже не знает, какие методы существуют на Derived еще.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector