调用封闭结构的成员函数

时间:2012-04-01 23:40:50

标签: c++ abstract-class function-pointers

我有一种情况,我有一个需要从封闭类调用函数的实例类。顶级类是生成代码并在底层类之后编译。结果是底层类不知道顶级名称。

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

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

显然这不起作用,因为没有topClass的定义。 我如何安排这个,以便可以从bottomClass函数调用topClass函数?我尝试使用带有纯虚函数的父类,但是在调用函数时会崩溃。

//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 }
}

有没有更好的方法来解决这个问题?我不能做的一件事是为底层提供顶级的名称/定义,但顶级函数的存在和名称是有保证的。

2 个答案:

答案 0 :(得分:3)

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`

答案 1 :(得分:0)

您可以将bottom设为模板:

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

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

这是否可行取决于相关模板定义是否在正确的位置可见,以及是否需要代码重复。您可以在某种类型的擦除方案中将bottom模板设置为其他固定的单个“底部”类中的一个小组件。