2014-01-30 5 views
0

У меня есть три класса. A, B и C.Указатель на абстрактный класс

Класс B - это абстрактный класс.

класса А должен вызывать функции из класса В.

Класс C является производным от класса B, а также необходимо провести указатель класса А для вызова функции класса А.

Требование 1:

Требуется указатель на B. Я знаю, что это может быть достигнуто с использованием «B», являющегося абстрактным классом, его невозможно создать экземпляры. Поэтому я создаю экземпляр C в A и использую его для вызова функций B . "Но сталкиваются с проблемами при создании экземпляра C.

Требование 2:

Класс C необходим указатель на класс А называть его функции. Как мне это достичь?

//A.h 

class A 
{ 
public: 
    void fun1(); 
    void fun2(); 
private: 
    // creating ptr to C because B is an abstract class 
    C *m_ptrC; 
}; 

//A.cpp 

void A::fun1() 
{ 
    m_ptrC->fun4(); 
} 
void A::fun2() 
{ 
    //some code 
} 



//B.h 
class B 
{ 
public: 
    //pure virtual function 
    void fun3() = 0; 
    void fun4(); 
}; 


//B.cpp 

void B::fun4() 
    { 
      //pure virtual hence C::fun3() gets called 
     fun3(); 
    } 



//C.h 
class C:public B 
{ 
public: 
    //Overridden from B 
    void fun3(); 

private: 
    //Ptr to class A, to call fun 
    A *ptrA; 
}; 

//C.cpp 
//Overridden from B 
void C::fun3() 
{ 
    ptrA->fun2(); 
} 

Как следует инициализировать ptrC и ptrA? Также я не уверен в прямом объявлении, и файл включает результат с ошибкой перефразирования/неполного типа.

+2

Добавить код, демонстрирующий проблему. –

+0

Что вы делаете или не имеете, не ясно из вашего заявления. У вас есть класс, который происходит от B и реализует функции? – crashmstr

+1

Я думаю, что OP имеет проблему с круговыми зависимостями. это может помочь. – Jarod42

ответ

1

Без фактического кода, который показывает эту проблему, вот что я думаю, что происходит:

: Вы включая C.h в хиджры и C.h в хиджры Это называется циклической зависимостью. Чтобы этого избежать, вам нужно использовать форвардную декларацию. Вы в основном объявляете класс и включаете его заголовок в файл cpp, фактически используя его. Например, в A.h вы могли бы:

class C; 

class A 
{ 

void fun1(); 

private: 

C *ptrC = new C; 
}; 

И в A.cpp вы можете включить C.h.

Другие проблемы могут отсутствовать, включая защитников в ваших заголовках.


: экземпляр пропускам (в качестве исх или указатель) к C конструктора. Здесь также используйте форвардную декларацию. Будьте осторожны в отношении срока службы объектов.

Наличие циклических зависимостей, как, например, часто больше проблем, чем того стоит. Попробуйте иметь интерфейс для A (чтобы вы могли передать его на C без включения A.h в блок перевода C) или использовать функторы, привязанные к экземпляру A.


: Я действительно не понимаю, почему у вас есть интерфейс C, если вы не используете полиморфизм, но это может быть вызвано не хватает реального кода.

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