Определить предикат в классе

У меня есть класс с методом, который я также хотел бы использовать в качестве предиката.

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.

3

Решение

В отличие от 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);
}
};
};
0

Другие решения

Сделайте этот предикат статическим методом. Но это не может быть const затем.

5

По вопросам рекламы [email protected]