Вызов функции-члена ограждающей структуры - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть ситуация, когда у меня есть экземпляр класса, который должен вызвать функцию из включающего класса. Верхний класс генерируется кодом и компилируется после нижнего класса. Как следствие, имя верхнего класса не известно нижнему классу.

class topClass
{
  public:
    void topFunction();
    bottomCLass * bcInst;
}

class bottomClass
{
  void * owner;
  void someFunction() {owner->topFunction(); }
}

Очевидно, что это не сработает, поскольку нет определения для topClass. Как я могу организовать это так, чтобы функция topClass могла быть вызвана из функции bottomClass? Я пытался использовать родительский класс с чисто виртуальной функцией, но это вызывает сбой при вызове функции.

//This is defined and compiled with bottomClass
class classTemplate
{
  public:
    virtual void topFunction()=0;
}

class topClass : public classTemplate
{
  public:
    void topFunction();
    bottomClass * bcInst;
}

class bottomClass
{
  classTemplate * owner;
  void someFunction() {owner->topFunction();//Crashes here }
}

Есть ли лучший способ решить эту проблему? Единственное, что я не могу сделать, это дать нижнему классу имя / определение высшего класса, однако наличие и имя topFunction гарантировано.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Переместить someFunction() реализацию в CPP и включить в нее оба заголовка. Это вам очень поможет:

topClass.h:

#ifndef TOPCLASS_H
#define TOPCLASS_H
#include "bottomClass.h"
class topClass
{
  public:
    void topFunction();
    bottomCLass * bcInst;
}
#endif

bottomClass.h:

#ifndef BOTTOMCLASS_H
#define BOTTOMCLASS_H
class bottomClass
{
  void * owner;
  void someFunction();
}
#endif

classes.cpp:

#include "topClass.h"
#include "bottomClass.h"

void bottomClass::someFunction() {owner->topFunction(); }`enter code here`
0 голосов
/ 02 апреля 2012

Вы можете сделать bottom шаблоном:

struct topclass
{
    void topfunction();
    bottom<topclass> * bcInst;
    // ...
};

template <typename T>
struct bottom
{
    T * p;
    void somefunction() { p->topfunction(); }
};

Будет ли это возможным, зависит от того, видны ли соответствующие определения шаблона в нужных местах и ​​требуется ли дублирование кода.Вы можете просто сделать шаблон bottom небольшим компонентом внутри фиксированного, единственного «нижнего» класса в какой-то схеме стирания типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...