2016-04-21 48 views
1

我在設計中有三類基類(結構)成員。C++類成員基數和聲明之間的映射是否正確?

  • 0或1
  • 0以上
  • 恰好一個

我已將他們映射到下面的聲明如類(結構)的成員

class Foo { 
     ExactlyOnce exactlyOnce; 
     std::unique_ptr<ZeroOrOnce> zeroOrOnce; 
     std::list<std::shared_ptr<ZeroOrMore>> zeroOrMore; 
}; 

我打算在整個包中推廣這種模式,這種方法是好的,或者它有一些錯誤會員基數?

回答

1

看起來不錯。

考慮以下雖:使用boost::optionalZeroOrOne(如果你已經使用boost)

  • ;其背後的意圖更爲明確,因爲API已針對此進行了優化。使用代替std::list<std::shared_ptr<T>>代替ZeroOrMore。除了大型/昂貴的對象並執行前置和隨機插入的情況外,矢量往往會更有效率。

+0

'boost :: optional'看起來不錯! :) – Samik

+0

同意兩個,特別是'vector'。注: - '可選的'正在被集成爲'std :: optional'在C++中17 –

2

對於​​3210基數按值存儲元素,而不是按指針存儲。如果沒有別的辦法,只能將指針存儲爲最後的手段。

+0

如果我沒有移動構造函數,那會不會很慢? – Samik

+2

@Samik零值或更多值可能需要一個可選類型。但關於指針的觀點非常好。另外,所有權語義是基數的一個單獨問題。爲什麼你會將共享所有權用於零個或多個,但對一個或多個所有權具有唯一所有權? – juanchopanza

+3

@Samik它取決於,使用你最好的判斷和驗證與探查。此外,元素不會在'std :: list'中移動,而他們在'std :: vector'中執行。 –