如何从模板类重载创建的指针对象上的运算符?
How can I overload an operator on created pointer object from template class?
我创建了一个以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;
有关运算符重载的更多信息,请参阅运算符重载的基本规则和习语是什么?
相关文章:
- 为什么指针对象没有调用默认构造函数
- 如何访问双指针对象中的方法
- 如何使用智能指针对象执行成员函数指针
- 调用带有指针对象错误的指针变量
- 如何从模板类重载创建的指针对象上的运算符?
- C++指针对象的运算符重载
- 如何初始化数组指针对象
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- C++指针对象差异
- 涉及继承,指针对象的交易以及何时进行的问题
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 字符指针对象和相应的字符数组元素比较
- 如何在 c++ 中克隆为弱指针对象
- 指针对象使用CPP中的指针表达式进行比较
- Visual Studio中智能指针对象的自定义视图
- 使用指针 /对象 /模板参数正确构成
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- 如何将值分配给指针对象 c++
- 更改智能指针对象,然后访问它