2012-04-17 22 views
1

沒有從我的代碼片段:避免在局部範圍內動態分配

const std::pair<Info, const ElementHandler&>& handle() const { 
        FileHandler fileHandler = FileHandler(); 
        std::pair<Info, const ElementHandler&> result = std::pair<Info, const FileHandler&> (info, fileHandler); 
        return result; 
       } 

我有以下的編譯錯誤:

error: cannot declare field ‘std::pair<Synchronizer::Info, Synchronizer::ElementHandler>::second’ to be of abstract type ‘Synchronizer::ElementHandler’ 

如何我可以編寫代碼來保存的想法?是否有可能,或者我需要使用指針和動態分配?

+1

無論編譯錯誤的,你永遠不應該返回一個引用到本地聲明的變量! – Nick 2012-04-17 09:08:25

回答

1

"Avoid dynamic allocation in local scope".

如果這是破碎代碼背後的驅動需求,那麼我不會按照趨勢告訴你如何修復它以做你不想要的東西;-)。相反,你必須適當考慮這些影響。你必須有一個與調用者需求相匹配的變量。必須排除局部自動變量 - 當函數返回時它們被銷燬。所以,你可以:

  • 使用功能範圍的static變量或全局變量,但是這將是函數被調用同一個變量,每次有可能是線程安全問題(你的編譯器可以支持一些線程特定的關鍵字,和POSIX具有功能以支持線程特定數據 - 但1-對象每線程仍然可以限制太多)
  • 創建一些緩衝液空間許多變量,並把他們的壽命和再利用的控制在適合的客戶端代碼某種方式(例如,通過一個旋轉陣列明知委託人將釋放他們在他們回來了,爲了永遠需要比同時數組的大小更多)
  • 讓客戶端代碼擔心生命時間(他們可能比你更瞭解)並提供一個你要加載結果的變量(例如, bool load_my_x(X&);
    • 這裏有一個問題是,來電者需要爲文件處理器分配空間,而不是簡單ElementHandler
1
  1. 分配fileHandlernew,或可能是某種shared_ptr。當函數退出時,當前對fileHandler的引用將無效。
  2. 按價值返回result而不是參考。
+0

我假設他開始沿着這條路,因爲elementhandler是虛擬的 – 2012-04-17 09:13:03

1

您有需要用到動態分配。

在你的函數要創建一個局部變量「的FileHandler」並返回對它的引用。只要函數返回,'fileHandler'就會超出範圍並被破壞,從而導致引用無效。

我覺得你可以很好地解決使用智能指針(的unique_ptr,shared_ptr的,...)這個問題。你的智能指針可以指向ElementHandler,如果ElementHandler具有虛擬析構函數,如果該對被刪除或超出範圍,它將被正確地銷燬。

+0

喜歡unique_ptr shared_ptr儘可能,包括這裏。 – 2012-04-17 09:13:42

+0

好的,同意。改變了答案。 – Patrick 2012-04-17 09:17:39

+0

@MooingDuck其實,這裏可能是'shared_ptr'更好的情況。他真正需要的是價值語義,但價值語義不適用於多態。 'shared_ptr'具有真正的值語義。雖然指向對象獲取引用語義,但它是指向const(這裏)的指針的事實意味着該區別是沒有意義的。 – 2012-04-17 09:27:35