我有两个类,它们都有许多扩展它们的类(用于多个级别)。由于多态性,我只在堆上分配它们。
我想重载<<operator
,以便我可以“流”到另一个。我希望将A << B
缩减为A->setNext(B)
,此函数将B存储在数组中 - 所以我可以执行此操作五次,并在数组中包含全部5个。
我想在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。
我同意詹姆斯的说法,这可能是滥用超载,取决于这一切最终会做什么。考虑使用普通的函数名称,例如setNext
,streamInto
等。如果它返回TypeA&
,您仍然可以“链接”对它的调用,例如A.streamInto(B1).streamInto(B2);
而不是A << B1 << B2;
{1}}