运算符重载和指向对象的指针,c++
我已经构建了一个代表矩阵的类,并且覆盖了所有 算术运算符。下面是重载一元负 RegMatrix.h 的示例
:
const RegMatrix operator - ();
RegMatrix.cpp
const RegMatrix RegMatrix::operator - ()
{
RegMatrix newMatrix(*this);
newMatrix *= -1;
return newMatrix;
}
现在,当我像这样实例化堆栈上的对象时,效果非常好: RegMatrix a(3,3,v)
(v 是值向量,无关紧要)。 当我像这样使用 new
关键字时(在 main.cpp 中):
RegMatrix* a = new RegMatrix(3,3,v);
RegMatrix* b = -a; //<---ERROR HERE
我得到 一元减号的类型参数错误
有什么想法为什么会发生这种情况吗?谢谢!
聚苯乙烯 另一个问题:“=”运算符会被复制构造函数自动覆盖,对吧?
I've build a class representing a matrix and I override all
the arithmetic operators. Here's an example of overloading the unary minus
RegMatrix.h:
const RegMatrix operator - ();
RegMatrix.cpp
const RegMatrix RegMatrix::operator - ()
{
RegMatrix newMatrix(*this);
newMatrix *= -1;
return newMatrix;
}
Now, this works perfect when I instantiate object on the stack like this: RegMatrix a(3,3,v)
(v is a vector of values, doesn't matter).
When I use the new
keyword like this (in main.cpp):
RegMatrix* a = new RegMatrix(3,3,v);
RegMatrix* b = -a; //<---ERROR HERE
I get wrong type argument to unary minus
Any ideas why this happens? Thanks!
P.S.
Another question: the '=' operator is automatically overridden by the copy constructor, right?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
a
的类型是RegMatrix *
,而不是RegMatrix
;如果要对a
指向的对象应用运算符,则必须取消引用a
(*a
),请将运算符应用于该对象 (-(*a)
),如果您想在堆上有一个单独的实例,请使用new
和复制构造函数在堆上创建它的新副本:不过,正如 @leftaroundabout 在评论中指出的那样,这不是一个好方法在 C++ 中工作,根据经验,如果可以的话,您会尽量避免动态分配(它会更慢,并且如果您不希望内存泄漏,则需要智能指针)。
The type of
a
isRegMatrix *
, notRegMatrix
; if you want to apply operators on the object to whicha
points you have to dereferencea
(*a
), apply the operator to it (-(*a)
) and, if you want a separate instance of it on the heap, create a new copy of it on the heap withnew
and the copy constructor:Still, as @leftaroundabout pointed out in a comment, this is not a good way to work in C++, where, as a rule of thumb, you try to avoid dynamic allocation if you can (it's slower and it requires smart pointers if you don't want memory leaks).