2013-04-23 110 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