所以,我对C ++很新,但我做了很多C编程。部分作为练习,也部分是因为我没有矩阵包允许对我想要的事物进行细粒度控制,我一直在编写自己的矩阵类mtMatrix并重载各种运算符以便我方便地编写方程式。在检查矩阵具有相同大小之后,我已经重载了+, - ,/和*来执行逐元素算术运算,而完全矩阵乘法是通过类方法Mult()完成的。我进一步重载+, - ,/和*以通过标量乘以矩阵,所以我可以有一个mtMatrix M并写“mtMatrix T = M * 2.0”来获得一个新的矩阵,其条目是旧的两倍大一。但是,当我尝试写“mtMatrix T = 2.0 * M”时,我遇到了问题,我不确定如何为+, - 和*编写重载来实现这一点,即使我想要的是与我输入“mtMatrix T = M * 2.0”的结果完全相同。在这两种情况下,重载函数的内容似乎是相同的,但函数的签名会有所不同。有人能指出我正确的方向吗?
答案 0 :(得分:2)
您需要创建一个与左值相关联的运算符作为int。您在班级中声明的操作员*具有左值'这个'因此M * 2.0有效。
为了创建一个与int关联的运算符,你需要在类之外声明它,如果运算符的rvalue是你的类的对象,那么你需要将它声明为朋友,以便它可以访问私有值。
下面是一个示例,其中的类不是矩阵,而是模拟您想要完成的行为。
#include <iostream>
class M
{
int value_;
public:
M(int value):value_(value){}
int& operator()() { return this->value_; }
int operator()() const { return this->value_; }
int operator*(int value) { return this->value_ * value; }
friend int operator*(int, const M&) ; //so it can access the M private objects
};
int operator*(int value, const M& other)
{
return value * other.value_;
}
int main()
{
M m0(10);
M m1(5);
m0() = m0() * 10;
std::cout << m0() << std::endl;
m0() = 10 * m1();
std::cout << m0() << std::endl;
return 0;
}