1

当我使用抽象基类时,我无法弄清楚必须如何完成重载比较运算符。主要问题是使用该基类实现多态性,因为它是抽象的,因此无法实例化,因此我不得不使用指向该基类的指针来访问派生类方法。我会放一些代码来更好地描述这种情况:

template <typename _Tp>
class Base 
{
    private: 
       _Tp attr ; 
    public: 
       foo() = 0 ; 
       friend bool operator == ( Base* b1, Base* b2)  
       {
           return ( b1.attr == b2.attr ) ;
       }
}; 

template <typename _Tp> class Derived_1 : public Base<_Tp> { /.../ } ;
template <typename _Tp> class Derived_2 : public Base<_Tp> { /.../ } ; 

int main (void)
{
    vector<Base*<int> > * v = new vector<Base*<int> > (2,0) ; 
    v[0] = new Derived_1 () ; 
    v[1] = new Derived_2 () ; 
    if ( (*v)[0] == (*v)[1] ) { /.../ }
    return 0 ;
}

所以,此时你会注意到(*v)[0] == (*v)[1]它是一个指针比较Base*。我想知道是否有办法重载这两个指针之间的比较运算符,因为从不使用基类中定义的重载运算符。

回复后编辑:

因为在我的真实代码中,比较必须是(*v)[0] == (*v)[1]我无法比较对象,因为我的数据结构会失去一般性。因此,我想问你的是:

Base可以做指针的比较吗?如何?

我从编译器那里得到错误,告诉我:

bool operator == (Base*,Base*) 必须有一个类或枚举类型的参数。

4

3 回答 3

2

从未调用基类的原因operator==是因为该行

v[0] == v[1]

比较两个指针 - 索引 0 和索引 1 处的向量的内容。

您可以将其更改为*v[0] == *v[1],它将使用基类运算符进行比较。

但是,在多态设置中使用重载运算符充满了困难。有关这方面的更多信息,请查看 Scott Meyers 在“Effective C++”中所说的话。

于 2013-07-31T12:53:39.477 回答
1

使用Boost 指针容器库

#include <boost/ptr_container/ptr_vector.hpp>
...

int main()
{
    boost::ptr_vector<Base> v;
    v.push_back(new Derived_1);
    v.push_back(new Derived_2);

    if (v[0] == v[1]) { std::cout << "success\n"; }
}

如果要将多态对象存储在使用比较的容器中,Boost Pointer Container Library 也有ptr_setptr_map和。但是,您提到了一个堆。没有。在这种情况下,您只需提供自己的比较器即可。ptr_multisetptr_multimapboost::ptr_priority_queuestd::priority_queue

struct BasePtrComp
{
    bool operator()(Base const* lhs, Base const* rhs) const
    {
        return *lhs < *rhs;
    }
};

...

std::priority_queue<Base*, std::vector<Base*>, BasePtrComp> v;

尽管我建议您在此处使用智能指针。

于 2013-07-31T13:05:49.023 回答
0

所以你想要的是在指针比较中比较对象属性,在这种情况下你需要重载指针的 operator== 或ineger。这不是它的工作方式,因为在比较整数时需要某种“instanceOf”,但这些并不总是指针。

于 2013-07-31T13:29:09.870 回答