我有一个带有方法的类,我也希望能够将其用作谓词。

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()。我需要使用 friend 类吗?或者有更好的解决方案吗?

我没有使用 C++11,所以不能使用 lambda 函数。

更新: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);
        }
    };
};

关于c++ - 在类中定义谓词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18509784/

10-15 04:50
查看更多