我有一个带有虚拟方法的课程定义。
在编译时,我收到错误'MethodType Class::Method'
不是类的静态成员 Class
我发现最流行的解决方案是将关键字 static 添加到头文件中的Method定义中。
但是,该方法定义为虚拟。因此,要添加静态关键字,我必须删除虚拟关键字。遗憾的是,由于该类继承了此方法也声明为虚拟的父类,因此无法完成,从而导致另一个编译器错误。 (请注意,我使用的是已定义的接口,无法访问父类的源代码)
有没有人有任何想法?
标题文件:
class X : public OtherClass
{
public:
X();
~X();
virtual structType MethodName(ParamType1,ParamType2);
};
然后在CPP文件中我有:
structType * X::MethodName(ParamType1 P1, ParamType2 P2)
{
//Implementation here
}
这会被标记为错误:
'structType* X::MethodName' is not a static member of 'class X'
答案 0 :(得分:3)
如果要在没有该类对象的情况下调用方法,则必须将其设为static
。这对虚拟方法毫无意义
您必须创建该类的对象,然后调用该方法。
struct X {
static int bar();
int foo();
};
X::bar(); // Works, static method called
X::foo(); // Doesn't work (your problem)
X x;
x.bar(); // Works, but X::bar() recommended (so that one sees that it's static...)
x.foo(); // Works, your solution
答案 1 :(得分:3)
我认为你有一个解析错误。
你的班级定义说:
class X : public OtherClass {
public:
X();
~X();
virtual structType MethodName(ParamType1,ParamTYpe2);
};
但是您对MethodName
的定义有不同的返回类型:
structType* X::MethodName(ParamType1 P1, ParamType2 P2) {
//Implementation here
}
编译器并不确定如何做到这一点,并且认为你正试图用不存在的静态成员做某事,出于某种原因。
解决方案是修复函数定义和声明,以便函数具有一个单一的一致返回类型。 structType
或structType*
。
答案 2 :(得分:0)
想出来。
最后。在MethodName1
的实现中 structType * X::MethodName(ParamType1 P1, ParamType2 P2)
ParamType1是非标准类型。它实际上是底层应用程序中的一个类 我只有API。
事实证明,类ParamType1的实现缺失/未编译/某事。
链接的问题与我加载的类没有关系,即使它因为编译器提供的行而显得如此。 因此,为了将来参考,在函数定义中使用类和结构时,请留意这个链接错误。
再次感谢所有人的协助。