过载<

时间:2013-06-24 16:12:18

标签: c++ polymorphism operator-overloading

我有两个类,它们都有许多扩展它们的类(用于多个级别)。由于多态性,我只在堆上分配它们。

我想重载<<operator,以便我可以“流”到另一个。我希望将A << B缩减为A->setNext(B),此函数将B存储在数组中 - 所以我可以执行此操作五次,并在数组中包含全部5个。

我想在2个基类中编写代码,并具有子类继承的功能。这可能吗?

2 个答案:

答案 0 :(得分:0)

在基类中,你需要像:

这样的东西
class Base
{
    virtual void streamInto( Base const& other ) = 0;
public:
    Base& operator<<( Base const& other )
    {
        streamInto( other );
        return *this;
    }
};

当然,这仍然保持语义开放:每个人都做了什么 派生类与他们收到的Base const&一起做什么?如果 A中的行为也取决于other的类型,你是 将要实施经典的双重调度之一 方案

<<真的适用于此吗?如果没有格式化 外部格式,可能是运营商超载滥用。 在类似BigInteger类的东西上移位也是如此 可以接受,但就是这样。

答案 1 :(得分:0)

这可能与您正在寻找的东西类似。

// In B.hpp:
#include <memory>

class TypeB
  : public std::enable_shared_from_this<TypeB>
{
    //...
};

// In A.hpp:
#include <memory>
#include <vector>
#include "B.hpp"

class TypeA
{
public:
    TypeA& operator<<( TypeB& source );
    virtual void reset_B_list(); // (maybe)
    //...
private:
    typedef std::vector<std::shared_ptr<TypeB>> B_list_type;
protected:
    typedef B_list_type::const_iterator B_iter_type;
    B_iter_type B_list_begin() const;
    B_iter_type B_list_end() const;
    virtual void added_B( TypeB& new_source );
private:
    B_list_type m_B_list;
    //...
};

inline TypeA& TypeA::operator<<( TypeB& source ) {
    m_B_list.push_back( source.shared_from_this() );
    added_B( new_source );
    return *this;
}

请务必使用new B(args)替换所有std::make_shared<B>(args)个表达式。

如果你不能使用std::shared_ptr,几乎完全相同的是Boost。

我同意詹姆斯的说法,这可能是滥用超载,取决于这一切最终会做什么。考虑使用普通的函数名称,例如setNextstreamInto等。如果它返回TypeA&,您仍然可以“链接”对它的调用,例如A.streamInto(B1).streamInto(B2);而不是A << B1 << B2; {1}}