2009-12-31 50 views
2

我有一個包含一些boost :: numeric :: ublas :: matrix的類。我想重載類的操作符(+ - */=),以便我可以用一個語句對這組矩陣進行操作。運算符爲包含boost :: numeric :: ublas :: matrix的類重載<double>

但是,這似乎需要我的班級的臨時實例攜帶值而不修改原始類。這對我來說很有意義,但是,當我在函數內部創建一個新的實例並返回它,我得到:

警告:引用局部變量「臨時」返回

我很新的C++和運算符重載的例子似乎都返回新的臨時對象。我也想避免實例化新矩陣的開銷,這導致我遍歷所有元素。我應該怎麼做呢?性能是一個問題。

+1

您正在創建一個新矩陣,您需要創建一個新矩陣。這意味着複製您的數據並對其執行算術運算。 – GManNickG 2009-12-31 17:34:33

+1

你需要返回一個值,而不是一個參考 - 真的沒有辦法繞過這個。 – 2009-12-31 17:35:28

+0

我真的很高興我問過。謝謝 – ccook 2009-12-31 17:46:58

回答

3

如果您已經使用了增強功能,我強烈建議使用boost::operators以及您的示例。

你會得到一些好處:

  1. 您只需要重載+ =/- =/= 運營商,並獲得+/-/運營商是免費的。
  2. 您將擁有自由實施的操作員的最佳實施。
  3. 你會擺脫你發佈的問題,因爲你將實現=版本,這需要更少的設計。
+0

謝謝,我會在星期一給你一個鏡頭! – ccook 2010-01-02 12:19:23

1

運算符重載的傳統方式如下。 (我認爲)

你就地運營商被定義爲成員,如:

foo& operator+=(const foo& rhs); 
foo& operator*=(const foo& rhs); 
// etc. 

簡單地做他們需要在*this什麼:

foo& operator+=(const foo& rhs) 
{ 
    // add elements together 

    return *this; 
} 

然後撥打免費的功能,讓副本在參數中完成:

const foo operator+(foo lhs, const foo& rhs) 
{ 
    return lhs += rhs; 
} 

返回值是const因爲這是奇怪的事情:

foo a, b, c; 
(a + b) = c; 

以同樣的方式很奇怪的事:

int a, b, c; 
(a + b) = c; 

雖然你會得到不同的上的意見。這就是您重複使用代碼的方式,並自動爲您完成副本。非常簡潔易讀。

就像Neil和我上面所說的那樣,如果你正在創建新的數據,那麼在某些時候數據需要有一個新的地方。儘可能避免使用變異運算符,但有些事情根本無法逃脫。

這可能不是一個問題。如果是,請嘗試優化您擁有的內存分配;這些可能是最慢的部分。我不確定,但我認爲大多數boost類允許你指定一個分配器。 boost存儲池庫在這裏可能很有用。

+0

有趣,謝謝。到目前爲止,我一直在使用就地操作符並仔細操作一個臨時對象。 – ccook 2010-01-01 20:03:20