如何重载C ++运算符以添加double plus <matrix>?

时间:2015-09-18 21:30:07

标签: c++ operator-overloading

所以,我对C ++很新,但我做了很多C编程。部分作为练习,也部分是因为我没有矩阵包允许对我想要的事物进行细粒度控制,我一直在编写自己的矩阵类mtMatrix并重载各种运算符以便我方便地编写方程式。在检查矩阵具有相同大小之后,我已经重载了+, - ,/和*来执行逐元素算术运算,而完全矩阵乘法是通过类方法Mult()完成的。我进一步重载+, - ,/和*以通过标量乘以矩阵,所以我可以有一个mtMatrix M并写“mtMatrix T = M * 2.0”来获得一个新的矩阵,其条目是旧的两倍大一。但是,当我尝试写“mtMatrix T = 2.0 * M”时,我遇到了问题,我不确定如何为+, - 和*编写重载来实现这一点,即使我想要的是与我输入“mtMatrix T = M * 2.0”的结果完全相同。在这两种情况下,重载函数的内容似乎是相同的,但函数的签名会有所不同。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

您需要创建一个与左值相关联的运算符作为int。您在班级中声明的操作员*具有左值&#39;这个&#39;因此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;
}