3

述語としても使用できるようにしたいメソッドを持つクラスがあります。

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 のメンバーを使用するため、静的にすることはできません。

4

2 に答える 2

5

この述語を静的メソッドにします。しかし、それはできませんconst

于 2013-08-29T11:32:38.843 に答える
0

Java とは異なり、C++ では、内部クラスは外部クラスへのポインターを所有しません。

MyClass::AncestorPredicate、 のインスタンスを持たず、そのクラスのオブジェクトへのポインタなしでMyClassの非静的メソッドを呼び出すことはできません。MyClass

次の 2 つのオプションがあります。

まず。の静的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);
        }
    };
};
于 2013-08-29T11:39:18.537 に答える