簡體   English   中英

c ++ push_back,非const復制構造函數

[英]c++ push_back, non const copy constructor

我有一個班,我想推回到一個雙端隊列。 問題是,當我推回時,我需要更改原始對象,因此我需要一個非const復制ctor。 現在,如果我實現我的const復制ctor被調用。 如果我刪除了常量,我得到一個關於沒有可用的ctors的編譯錯誤。 我如何實現這一點,我可以修改原始結構,當我傳入它? 我需要修改它bc當類超出范圍時類破壞對象,我想告訴它不要在有另一個實例時這樣做。 我不能使用提升,因為我的平台不支持它。

您的問題是標准容器的基本要求是對象是可復制構造的。 這不僅意味着它們具有復制構造函數,而且這也意味着如果復制對象,則副本和原始文件是相同的。

但是,您的對象類似於move-constructor語義。 也就是說,在移動之后,新對象擁有資源,舊對象為空。 從C ++ 03開始,deque不支持這一點。 順便說一下,禁止將auto_ptr放入容器的原因相同。

下一個名為c ++ 0x的C ++版本將通過引入特殊的移動構造函數來支持這些移動語義。 在此之前,當您要將對象放入標准容器時,必須使用共享所有權的對象。 這意味着如果您復制對象,並且原始文件超出范圍,則在所有副本超出范圍之前,不會釋放擁有的資源。 例如,考慮使用boost :: shared_ptr,或者將它包裝到您的類中,如果您不想編寫自己的類來管理它。

如果你沒有做什么狡猾的資源(見其他意見),然后讓你想改變可變將允許你改變它在一個const函數的成員變量。

根據你要做的事情(更多細節會很好),你可以在調用push_back之前/之后修改對象,或者編寫一個簡單的包裝類,它接受指向類的指針並可以插入到deque 然后,此對象可以在構造/銷毀/等上對您的類執行適當的操作。

你不能做你想做的事。 你必須使用普通或智能指針(但不是auto_ptr <>)。 你為什么不能使用Boost智能指針? 它們非常輕量級,應該適用於所有合理的標准C ++編譯器。 您不必使用所有Boost。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM