如何从模板类重载创建的指针对象上的运算符?

How can I overload an operator on created pointer object from template class?

本文关键字:指针 对象 运算符 创建 重载      更新时间:2023-10-16

我创建了一个以Matrix命名的模板类。我正在尝试弄清楚如何为指向矩阵对象的指针实现运算符+重载。我的目标是标量矩阵运算。我想为矩阵上的每个单元格添加一个整数值。我无法理解我的代码是怎么回事。模板让我很困惑。

"m1"是我的矩阵对象。当我使用m1 = m1+2时,我收到分段错误错误。

我尝试了许多不同的组合,但总是遇到相同的错误。

  • 我在没有指针的情况下尝试过。
  • 我尝试输入int而不是T
  • 我没有直接返回new Matrix <int> (10,10,2),而是尝试:
Matrix <int> * m = new Matrix <int> (10,10,2)
return m;
  • 当我删除 main 函数中的第二个m1->print();语句时,"分段错误"错误消失了,但每次我尝试打印时都会再次出现错误。

我的矩阵类:

template <typename T> 
class Matrix{
vector< vector<T> > matris;
public: 
Matrix(); // 10x10 matrix with zeros
Matrix(int width, int height, int value); 
void print();
Matrix* operator+(T value){
return (new Matrix<int>(10,10,2)); // 10x10 matrix filled with 2
}
};

我的主要功能:

int main(){
Matrix <int> *m1 = new Matrix <int>(); // 10x10 matrix with zeros
m1->print(); // it succesfully shows the elements
m1 = m1 + 2; // whenever I tried this, I get "Segmentation Fault"
m1->print();
return 0;
}

我的 print(( 函数:

template <typename T> 
void Matrix<T>::print(){
for(int h=0; h<matris.size(); h++){
for(int w=0; w<matris[0].size(); w++){
printf("%4d", matris[h][w]);
}
cout << endl;
}
}

输出:

0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
Segmentation fault

我的期望是分配成功,但我收到分段错误错误。我在这里做错了什么?

当您使用

m1 = m1 + 2;

不使用重载operator+。这只是指针算术。之后,m1指向您不拥有的内存。在此之后访问m1的成员会导致未定义的行为。

您可以通过以下方法从语法上修复此问题

m1 = *m1 + 2;

但它有自己的问题。当您这样做时,m1指向的原始内存将丢失到您的程序中。您有内存泄漏。

将重载作为

Matrix* operator+(T value) { ... }

不是惯用语。也许您想使用:

Matrix operator+(T const& value) const { ... }

更好的选择是使用几个非成员函数重载:

Matrix operator+(Matrix const& m, T const& value);
Matrix operator+(T const& value, Matrix const& m);

有了它,您可以使用:

Matrix<int> m1;
Matrix<int> m2 = m1 + 10;
Matrix<int> m3 = 30 + m1;

有关运算符重载的更多信息,请参阅运算符重载的基本规则和习语是什么?