2013-06-24 59 views
0

我有兩個類,它們都有一些擴展它們的類(對於多個級別)。由於多態性,我只能將它們分配在堆上。重載<<運算符進入多態對象

我想超載<<operator,這樣我就可以「流」到另一個。我想A << B,被縮減爲A->setNext(B),這個函數將B存儲在一個數組中 - 所以我可以這樣做5次,並且在數組中都有5個。

我想在這兩個基類中編寫代碼,並具有由children類繼承的功能。這可能嗎?

+0

「因爲多態的,我只分配他們在堆。」胡務..?並不確定中間點是什麼意思。至於最後一點 - 假設公有繼承,可以從派生類中調用基類中的任何非私有方法。基類中的任何公共方法都可以在派生類上調用。 –

+0

第二點 - 你的意思是重載(重複的方法名稱,但具有不同的參數),或者實際上overRIDE(實現基類方法的派生類)..? –

回答

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類別的移動也可以是 ,但就是這樣。

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; 
} 

記得用std::make_shared<B>(args)更換任何new B(args)表達式。

如果你不能使用std::shared_ptr,Boost中幾乎完全一樣。

我同意詹姆斯的看法,認爲這可能是濫用重載,這取決於這一切的結果。考慮只使用一個普通的函數名稱,比如setNextstreamInto等。如果返回TypeA&,你仍然可以「鏈」調用它,就像A.streamInto(B1).streamInto(B2);代替A << B1 << B2;