Я пытаюсь отправить производный указатель на функцию базового класса через другую функцию базового класса, но по какой-то причине он жалуется:
ошибка: неверное использование неполного типа ‘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;
}
ты знаешь как я мог это исправить?
Вы не можете использовать предварительное объявление, когда компилятору нужна информация о членах класса.
Предварительное объявление полезно только для сообщения компилятору о том, что класс с таким именем существует и будет объявлен и определен позже.
Так что сделайте как следующее:
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);}
Единственный способ — извлечь определения функций из объявления класса и поместить их после объявления Derived
, В тот момент, когда вы пытаетесь их использовать, плохой компилятор даже не знает, какие методы существуют на Derived
еще.