2013-04-23 132 views
-1

我在重載操作符「+」,「 - 」,「/」和「*」在我的程序中停留。 基本上我有一個對象,它是動態分配double值的數組。 我有整個程序,但我無法通過這些重載。C++重載操作符

我的構造是這樣的:

table::table(int size) { 
    this->size = size; 
    tab = new double[size]; 
    count++; 
} 

我已經寫了這樣的事情:

table & table::operator-(const table &tab3) 
{ 
     table * tab_oper2 = new table(size); 
     for(int i=0; i< tab3.size; i++) 
     { 
      (*this).tab[i] -= tab3.tab[i]; 
     } 
     return *this; 
} 

一般的作品,但它不是一般做的好方法。 我的老師告訴我試着將(* this)切換到* tab_oper2,將它作爲參考返回,但是 它不起作用。 請有人告訴我如何正確地做到這一點嗎?

+0

不要在'operator-'中修改'this'。用'table tab_oper2'之類的東西創建一個新的'table'。操作新表並按值返回。 – 2013-04-23 17:33:11

+0

或者,執行'operator- ='修改'this'。然後,只要該類型是可複製的,就可以很容易地實現'operator-'。 – 2013-04-23 18:18:08

回答

-3

你正在分配一個結果表,但你沒有填充它。填充結果表,它將工作。

table & table::operator-(const table &tab3) 
{ 
     table * tab_oper2 = new table(size); 
     for(int i=0; i< tab3.size; i++) 
     { 
      tab_oper2->tab[i] = tab[i] - tab3.tab[i]; 
     } 
     return *tab_oper2; 
} 
+4

它也會泄漏,因爲您將返回一個對不會被清理的分配指針的引用。 – rerun 2013-04-23 17:30:27

+0

對於我們所知道的,他使用的GC與他的C++ – antlersoft 2013-04-23 17:34:19

+0

@antlersoft:因爲他的代碼中沒有刪除?他只是一個錯誤,我認爲 – Guillaume07 2013-04-23 17:37:02

5

C++是一種面向值的語言;返回table(而不是table&)。在局部變量中構造返回值,並返回它。不要忘記三條規則:考慮到你展示的小代碼,你需要一個拷貝構造函數,一個賦值運算符和一個析構函數。 (當然,如果你使用的是std::vector而不是new[],所有這些都將爲你照顧。)

0

你應該返回值的第三目標result

table table::operator-(const table &t) const 
{ 
     table result(size); 
     for(int i=0; i< t.size; i++) 
     { 
      result.tab[i] = this->tab[i] - t.tab[i]; 
     } 
     return result; 
} 

運營商-是從運營商-=你在寫不同。當你超載operator-你不應該操縱this