在类中定义谓词

时间:2013-08-29 11:30:50

标签: c++ stl predicate

我有一个类,我也希望能够用作谓词。

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的成员。

2 个答案:

答案 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);
        }
    };
};