我有一个类,我也希望能够用作谓词。
class MyClass {
bool ParticleHasAncestor(const Particle &particle, int id) const;
class AncestorPredicate {
int mId;
public:
AncestorPredicate(int idCode) : mId(idCode) { }
bool operator()(const Particle &particle) const { return ParticleHasAncestor(particle, mId); }
};
};
但是,编译器抱怨在没有MyClass实例的情况下无法使用ParticleHasAncestor()
。我需要使用朋友班吗?或者有更好的解决方案吗?
我没有使用C ++ 11,所以不能使用lambda函数。
更新: ParticleHasAncestor()
无法变为静态,因为它使用了MyClass的成员。
答案 0 :(得分:5)
将此谓词设为静态方法。但它不能是const
。
答案 1 :(得分:0)
与Java不同,在C ++中,内部类不拥有指向外部类的指针。
MyClass::AncestorPredicate
,没有MyClass
的实例,如果没有指向该类对象的指针,则无法调用MyClass
的非静态方法。
您有两种选择:
<强>第一即可。将MyClass::ParticleHasAncestor
设为MyClass
的静态方法:
class MyClass {
static bool ParticleHasAncestor(const Particle &particle, int id);
class AncestorPredicate {
int mId;
public:
AncestorPredicate(int idCode) : mId(idCode) { }
bool operator()(const Particle &particle) const
{
return MyClass::ParticleHasAncestor(particle, mId);
}
};
};
<强>第二即可。创建MyClass
的实例并传递指向AncestorPredicate
的指针,以便您可以在该对象上调用ParticleHasAncestor
:
class MyClass {
bool ParticleHasAncestor(const Particle &particle, int id) const;
class AncestorPredicate {
int mId;
const MyClass* obj;
public:
AncestorPredicate(int idCode, const MyClass* _obj) : mId(idCode), obj( _obj ) { }
bool operator()(const Particle &particle) const
{
return obj -> ParticleHasAncestor(particle, mId);
}
};
};