2013-08-29 57 views
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,所以不能使用lambda函數。

更新:ParticleHasAncestor()由於它使用MyClass的成員,因此無法設置爲靜態。

回答

0

與Java不同,在C++中,內部類不擁有指向外部類的指針。

MyClass::AncestorPredicate,沒有MyClass的實例,並且您不能調用MyClass的非靜態方法,而不指向該類的對象。

你有兩個選擇:

首先。讓MyClass::ParticleHasAncestorMyClass一個靜態方法:

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:「......但它不能是`const`然後」

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

如果我使用第二個選項,我可以在MyClass中使用謂詞: 'electron.erase(std :: remove_if(electron.begin(),electron.end(),std :: not1(AncestorPredicate(higgs_id,this )())),electron.end())' –

+0

@DavidHall是的,你可以 –

+0

注意:我不應該在上面的附加括號。所以只需'AncestorPredicate(higgs_id,this)'而不用拖尾'()' –

5

使這個謂詞成爲一個靜態方法。但它不能是const

+1

並不是說它需要。 'const'在'static'成員函數中是沒有意義的。 – Angew

+1

如果'ParticleHasAncestor'是靜態的,他還可以採取下一步並考慮使用'std :: bind2nd',這樣他就可以放棄'AncestorPredicate' helper。 –

+0

我不能使'ParticleHasAncestor()'靜態,因爲它取決於MyClass的成員。 –