虽然我在C编程多年,但我目前正在开发一个C ++项目,我需要一些帮助。我有以下情况,我附上最简单的例子,我可以想出来。理想情况下,A类和B类不应更改。它们属于一个模拟框架,不应该使用特定于我的项目的代码来膨胀。
B类派生自A类,然后从B派生出许多类(D1,D2,最多D11)。所有这些派生类中的函数finishSpecific()都有大量的公共代码,我想把全局函数finishSpecificCommon()放进去。在这个函数中,我需要调用trace(),它将一些信息记录到跟踪文件中(为了简单起见,我在示例中更改了它的行为)。但是,我似乎无法弄清楚如何调用trace()。当前代码给出了folloawing错误:
example.cc: In function ‘void finishSpecificCommon()’:
example.cc:22:8: error: ‘trace’ was not declared in this scope
trace() << "Hello world!";
我当然研究了类似的答案,但在我的案例中存在一些阻碍我应用它们的差异。首先,trace()受到保护而不是公开的,就像我发现的所有例子一样。其次,有多个派生类(D1,D2,...,D11)而不是单个派生类,并且必须在所有派生类中调用finishSpecificCommon()。
我尝试过使用朋友失败了。此外,我尝试将一个对象作为参数传递给finishSpecificCommon(),通过它我可以调用trace(),但是卡在了应该传递的对象的类型中。
如果您有任何建议可以让我解开,我将不胜感激。
以下是示例代码。用gcc -c example.cc编译它
example.h文件:
#include <iostream>
class A {
protected:
virtual void finishSpecific() { };
std::ostream & trace();
};
class B: public A {
virtual void finishSpecific() {}
};
namespace D1_NS {
class D1: public B {
protected:
void finishSpecific();
};
}
namespace D2_NS {
class D2: public B {
protected:
void finishSpecific();
};
}
void finishSpecificCommon(void);
example.cc:
#include "example.h"
std::ostream & A::trace()
{
std::ostream & output = std::cout;
return output;
}
void D1_NS::D1::finishSpecific()
{
finishSpecificCommon();
}
void D2_NS::D2::finishSpecific()
{
finishSpecificCommon();
}
void finishSpecificCommon()
{
trace() << "Hello world!";
}
答案 0 :(得分:0)
在您的示例中,trace
是A类的成员。因此,您必须在类的实例中调用它或将其定义为static
。请注意,您在受保护的部分中定义了它,因此除非将其定义为该类的friend
,否则无法从外部函数调用它。
我想你应该将finishSpecificCommon()
添加到A类,这样你就可以在任何派生自A的类中使用它。
class A {
protected:
void finishSpecificCommon();
virtual void finishSpecific() { };
std::ostream & trace();
};
...
void D2_NS::D2::finishSpecific(){
finishSpecificCommon();
trace() << "Hello world!";
}