我有一种情况,我有一个需要从封闭类调用函数的实例类。顶级类是生成代码并在底层类之后编译。结果是底层类不知道顶级名称。
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 }
}
有没有更好的方法来解决这个问题?我不能做的一件事是为底层提供顶级的名称/定义,但顶级函数的存在和名称是有保证的。
答案 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
模板设置为其他固定的单个“底部”类中的一个小组件。