【问题标题】:Define predicate within class在类中定义谓词
【发布时间】:2013-08-29 11:30:49
【问题描述】:

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

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

【问题讨论】:

    标签: c++ stl predicate


    【解决方案1】:

    将此谓词设为静态方法。但那不可能是const

    【讨论】:

    • "...但它不能是const。"不是它需要。 conststatic 成员函数上毫无意义。
    • 如果ParticleHasAncestor 是静态的,他还可以采取下一步并考虑使用std::bind2nd,这样他就可以完全放弃AncestorPredicate 助手。
    • 我不能将 ParticleHasAncestor() 设为静态,因为它取决于 MyClass 的成员。
    【解决方案2】:

    与 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);
            }
        };
    };
    

    【讨论】:

    • 如果我使用第二个选项,我可以在 MyClass 中使用谓词吗:electrons.erase(std::remove_if(electrons.begin(), electrons.end(), std::not1(AncestorPredicate(higgs_id, this)())), electrons.end())
    • @DavidHall 是的,你可以
    • 注意:我不应该在上面有额外的括号。所以只需AncestorPredicate(higgs_id, this) 没有尾随()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多