我有兩個類,它們都有一些擴展它們的類(對於多個級別)。由於多態性,我只能將它們分配在堆上。重載<<運算符進入多態對象
我想超載<<operator
,這樣我就可以「流」到另一個。我想A << B
,被縮減爲A->setNext(B)
,這個函數將B存儲在一個數組中 - 所以我可以這樣做5次,並且在數組中都有5個。
我想在這兩個基類中編寫代碼,並具有由children類繼承的功能。這可能嗎?
我有兩個類,它們都有一些擴展它們的類(對於多個級別)。由於多態性,我只能將它們分配在堆上。重載<<運算符進入多態對象
我想超載<<operator
,這樣我就可以「流」到另一個。我想A << B
,被縮減爲A->setNext(B)
,這個函數將B存儲在一個數組中 - 所以我可以這樣做5次,並且在數組中都有5個。
我想在這兩個基類中編寫代碼,並具有由children類繼承的功能。這可能嗎?
在基礎類中,你需要財產以後這樣的:
class Base
{
virtual void streamInto(Base const& other) = 0;
public:
Base& operator<<(Base const& other)
{
streamInto(other);
return *this;
}
};
當然,這仍然留下語義開:那每一個 派生類做的Base const&
他們收到?如果 A
中的行爲還取決於other
的類型,那麼您必須執行 方案中的經典雙重調度方案之一 。
<<
真的適用於這裏嗎?如果沒有格式化爲 的外部格式,則可能是操作員超載濫用。 類似BigInteger
類別的移動也可以是 ,但就是這樣。
這可能是類似於你要找的東西。
// 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;
}
記得用std::make_shared<B>(args)
更換任何new B(args)
表達式。
如果你不能使用std::shared_ptr
,Boost中幾乎完全一樣。
我同意詹姆斯的看法,認爲這可能是濫用重載,這取決於這一切的結果。考慮只使用一個普通的函數名稱,比如setNext
,streamInto
等。如果返回TypeA&
,你仍然可以「鏈」調用它,就像A.streamInto(B1).streamInto(B2);
代替A << B1 << B2;
「因爲多態的,我只分配他們在堆。」胡務..?並不確定中間點是什麼意思。至於最後一點 - 假設公有繼承,可以從派生類中調用基類中的任何非私有方法。基類中的任何公共方法都可以在派生類上調用。 –
第二點 - 你的意思是重載(重複的方法名稱,但具有不同的參數),或者實際上overRIDE(實現基類方法的派生類)..? –