Это может быть что-то похожее на то, что вы ищете.
// 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;
«Из-за полиморфизма, я только когда-либо передать их на куча «. WUH ..? И не уверен, что означает средняя точка. Что касается последнего момента - если предполагается наследование, любой неличный метод в базовом классе может быть вызван из производного класса. Любой общедоступный метод в базовом классе можно вызвать в производном классе. –
2-я точка - вы имеете в виду перегрузку (повторное имя метода, но с разными аргументами), или фактически overRIDE (производный класс, реализующий метод базового класса).? –