2009-12-16 33 views
3

我有一個類test這是不標準施工的,也不分配由於某些原因。然而它是可複製的 - 可以說它的行爲有點像參考。置換矢量接受非標準施工的和未分配的類型

不幸的是,我需要這些元素的動態數組,並意識到vector<test>不是正確的選擇,因爲矢量的元素必須是標準的可構建和賦值的。好在我解決此問題得到了通過使用vector<T>::reservevector<T>::push_back代替vector<T>::resize和直接填充項(無標準建設)

  • 用於分配的copy'n'swap把戲,事實上,一個vector

    • 通常使用平普爾-成語(現有test元件沒有直接的分配)來實現,即

      class base { 
      private: 
          std::vector<test> vect; 
          /* ... */ 
      public: 
          /* ... */ 
          base& operator= (base y) { 
           swap(y); 
           return *this; 
          } 
          void swap(base& y) { 
           using std::swap; 
           swap(vect, y.vect); 
          } 
          /* ... */ 
      }; 
      

    現在我假設我可能沒有考慮過每一點點,而最重要的是這些技巧強烈依賴於實施。該標準只保證標準可構造和可分配類型的標準行爲。

    下一步是什麼?我如何獲得test對象的動態數組?

    備註:我一定比較喜歡內置的標準C++提供的解決方案和類。

    編輯:我才意識到,我的招數竟然沒有工作。如果我定義了一個真正的非賦值類,那麼我的編譯器會出現很多錯誤。所以這個問題凝結到最後一個問題:我怎樣纔能有這些test對象的動態數組?

    (*)我的test類提供了一個賦值運算符,但是這個運算符就像賦值給一個引用一樣。

  • +2

    我不確定我是否明白這句話:「一個矢量通常是用Pimpl-idiom實現的」在幾乎所有的編譯器上,矢量都是一個僅包含頭文件。 (如果不是每個) – GManNickG 2009-12-16 09:35:12

    +1

    在GNU標準庫中,矢量是一個類,它基本上包含一個指向內部類的指針,該指針提供了完整的矢量功能。矢量類只轉發這個功能。我認爲這是pimpl習語的意思。我錯了嗎? – phlipsy 2009-12-16 09:48:31

    +0

    不,你完全正確。 GMan錯誤地將pimpl習語與使用該習語的常見理由混爲一談。 – MSalters 2009-12-16 09:51:15

    回答

    3

    考慮使用Boost的ptr_vector,升壓指針容器庫的一部分。在該圖書館的motivation中特別看到優勢#3。

    +0

    不幸的是,我必須更喜歡構建解決方案,因爲我正與其他程序員在不同的平臺上使用不同的編譯器。限制爲最低限度優先。 – phlipsy 2009-12-16 09:34:58

    +3

    沒問題:所有內置容器都共享可分配的需求。因此,你需要一個非標準的。 Boost是明顯的候選人 - 幾乎是標準的,廣泛測試的自由許可證。 – MSalters 2009-12-16 09:54:27

    +0

    如果所有的編譯器都支持它,否則考慮使用'shared_ptr'(boost或TR1)或'reference_wrapper'(再次提升或C++ 0x)。無論如何,我同意MSalters,你可以做的最好的事情是增加項目的推動力。機會是支持所有您的編譯器,而TR1或C++ 0x擴展不被廣泛支持。 – 2009-12-16 10:30:29

    0

    編寫你自己的動態數組類。聽起來像少工作比試圖使STL一個工作與這種奇怪的類型。

    +0

    聽起來像這樣 - 儘管如此,使用標準提供的東西比您熟悉的解決方案更安全,也更不容易出錯。這就是爲什麼我問... – phlipsy 2009-12-16 09:38:10

    +0

    這可能是相當棘手的正確。我會建議反對它。 – 2009-12-16 10:31:17

    +0

    @phlipsy標準庫更安全且不易出錯_if_滿足其約束條件。這是幫助它正確和強大的約束條件。如果你試圖繞過它們,你可能會認爲你部分成功了,但是你將無法像在官方案例中那樣採取同樣的正確性。 – 2009-12-16 13:01:39

    0

    你可能想看看Boost.Intrusive - 儘管這意味着你將需要改變的test在內存中你把test實例的類型和位置。

    +0

    這些侵入式容器是一個有趣的想法,但它仍然有點超大我的需求。 – phlipsy 2009-12-17 09:56:26

    0

    如何使用指針的載體?

    +0

    最後,我完全按照這種方式解決了我的問題。但我不得不承認,這不是從我的問題本身產生的。我沒有提到我的測試對象可以存儲在別處。否則,我總是不得不擔心在使用後釋放物體...... – phlipsy 2009-12-17 10:02:17

    +0

    太棒了!有確鑿的警告,但他們可以四處走動。如果你可以,你應該使用某種智能指針。 – Jonas 2009-12-17 13:18:23