У меня есть класс с методом, который я также хотел бы использовать в качестве предиката.
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); }
};
};
Тем не менее, компилятор жалуется на невозможность использования ParticleHasAncestor()
без экземпляра MyClass. Нужно ли использовать класс друга? Или есть лучшее решение для этого?
Я не использую C ++ 11, поэтому не могу использовать лямбда-функции.
Обновить: ParticleHasAncestor()
нельзя сделать статическим, так как он использует члены MyClass.
В отличие от 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);
}
};
};
Сделайте этот предикат статическим методом. Но это не может быть const
затем.