我正在参考我昨天写的这个问题来写这个问题。在一些文档之后,我似乎很清楚,我想做的事情(以及我认为可能的事情)即使不是不可能也几乎是不可能的。有几种方法可以实现它,由于我不是经验丰富的程序员,所以我问你会采取哪种选择。我再次解释了我的问题,但现在我有一些解决方案要探索。
我需要的
我有一个 Matrix 类,我想实现矩阵之间的乘法,以便类的使用非常直观:
Matrix a(5,2);
a(4,1) = 6 ;
a(3,1) = 9.4 ;
... // And so on ...
Matrix b(2,9);
b(0,2) = 3;
... // And so on ...
// After a while
Matrix i = a * b;
我昨天吃的
目前我重载了两个运算符operator*
,operator=
直到昨天晚上,它们都是这样定义的:
Matrix& operator*(Matrix& m);
Matrix& operator=(Matrix& m);
operator* 在堆上实例化一个新的 Matrix 对象 ( Matrix return = new Matrix(...)
),设置值,然后:
return *result;
我今天拥有的
经过讨论,我决定以“不同的方式”实现它,以避免用户被任何类型的指针打扰并保持用法不变。“不同的方式”是按值传递 operator* 的返回值:
Matrix operator*(Matrix& m);
Matrix& operator=(Matrix& m);
operator*return
在堆栈上实例化,设置值,然后返回对象。
这种方法有一个问题:它不起作用。operator= 需要一个 Matrix& 并且 operator* 返回一个 Matrix。此外,由于另一个原因,这种方法对我来说看起来不太好:我正在处理可能非常大的矩阵,并且该库的目标是 1)对我的项目足够好 2)快速,所以可能通过按价值计算不应该是一种选择。
我探索了哪些解决方案
好吧,按照前面讨论中的建议,我阅读了一些关于智能指针的内容,它们看起来很棒,但我仍然无法弄清楚如何解决我的问题。它们处理内存释放和指针复制,但我基本上使用引用,所以它们看起来对我来说不是正确的选择。但我可能错了。
也许唯一的解决办法就是传值,也许我无法兼顾效率和良好的界面。但同样,你是专家,我想知道你的意见。