2013-09-20 4 views
1

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

#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

Почему базовый класс знает о производных классах? – soon

+1

@soon прав; это может быть сделано для работы, но, как правило, плохая идея дизайна состоит в том, чтобы базовые классы знали о производных классах. Возможно, лучший способ реализовать это - сделать 'getsomething()' виртуальной функцией. – Omaha

+0

Кроме того, функция 'receiveit' кажется совершенно бесполезной, поскольку она просто вызывает' getsomething' с обфускационным параметром 'output'. – dornhege

ответ

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);} 
0

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

Смежные вопросы