2013-03-04 65 views
0

我有許多分層地傳遞數據彼此發送器和接收器功能返回類型:C++,傳遞最佳參數,並且對於大型數據

class singleton 
{ 
TYPE3 var; //data populated from a hierarchy 
void Receive(TYPE3 a){ var = a;} 
} 

class C 
{ 
    void Receiver_from_B(TYPE2 a); 
    TYPE3 intermediate_value; 
    make_TYPE3(&intermediate_value){....;}//pseudo 
    TYPE3 Sender(){ return intermediate_value; } //finally sends it to a noncopyable class object 
}; 

class B 
{ 
    void Receiver_from_A(TYPE1 a); 
    TYPE2 intermediate_value; 
    make_TYPE2(&intermediate_value){....;}//pseudo 
    TYPE2 Sender_to_A(){ return intermediate_value; } 
}; 

class A 
{ 
    TYPE_I a; 
    TYPE_II b; 
    void Receiver_from_down_the-tree(TYPE_I a_){ a = a_}; 
    void Receiver_from_down_the-tree_(TYPE_II b_){ b = b_}; 
    TYPE1 intermediate_value; 
    void make_TYPE1(&intermediate_value, a , b) {.....;}//pseudo 
    TYPE1 Sender_to_B(){ return intermediate_value;} 
}; 

從這樣的樹中累積的數據量相對大我想跳過將數據從發件人複製到接收者。我想我需要constreference組合的參數和返回值的組合。 我很感激,如果你善意地建議我參數和返回值的最佳類型。

希望我解釋得很好。 感謝

+0

這是很難理解......這些類型'TYPEx'之間的關係是什麼?那些類「A」,「B」和「C」的作用是什麼?如果這些類沒有成員變量來保存中間結果,那麼'Receiver()'和'Sender()'是什麼意思? – lvella 2013-03-04 04:15:30

+0

@Ivella對不起,我認爲我必須是顯式的。你有權利,有中間變量。TYPEx之間的關係:簡單地想象TYPE_I是struct {int a; char b;},TYPE_II是'int',TYPE_III是'char'。然後,想象一個通過幾個接收函數接收'int'和'char'值的類,然後創建一個TYPE_I變量(中間值),最後將(TYPE_I a)發送到更高級別的類。更高類通過它的Receive()函數接收它,並且過程繼續。請注意,發送和接收與套接字progg無關。他們回調函數(encodeynthesis xml parser)。 – rahman 2013-03-04 04:34:43

+0

更改了代碼更清晰 – rahman 2013-03-04 04:48:20

回答

1

一個標準的方式來傳遞的對象的方法/功能,以避免重複制是使用一個const的引用:

void my_method(const BigObject & big) 
{ 
    // do something with big 
} 

&使得它的基準,並且避免了對象的深拷貝。 const受讓人沒有進一步的修改。在C++中有許多其他的方法來避免複製,例如移動構造函數模式,傳遞指針(我建議將它們包裝在std :: shared_ptr中)。這取決於你的設計。

+0

@M M.非常感謝。我認爲這就是我正在尋找的。只是一個重要的觀點。當另一個方法(比如說「BigObject B :: send(){return intermediate;}」)返回一箇中間變量(比如說「BigObject intermediate_var」)時,將「const BigObject&big」傳遞給A :: my_method() B的實例可能會超出範圍(刪除),這是否會導致懸掛引用?這就是爲什麼你建議使用'const'關鍵字?如果是,我可以在以後將'const_cast'應用到'big'參數'my_method'內?再次感謝 – rahman 2013-03-04 07:55:56

+0

否BigObject B :: send(){return intermediate;}'返回'intermediate'的一個副本,並且沒有問題(如果BigObject已經定義好) – deepmax 2013-03-04 08:02:23

+0

@M M. Oh no ,對不起,我的意思是'BigObject&B :: send(){return intermediate;}'或'const BigObject&B :: send(){return intermediate;}'(請告訴我應該使用哪一個)。它會執行不可取的副本,而且如果我使用上述任何一種類型作爲返回類型,同樣的問題是不是會創建一個danglig引用? – rahman 2013-03-04 08:48:57