【问题标题】:() = operator overload in class() = 类中的运算符重载
【发布时间】:2012-03-19 22:49:23
【问题描述】:

我正在为所有运算(例如加法、减法、乘法、逆运算等)构建一个 Matrix 类。我重载了简单的运算符,例如 + - () *。但我正在尝试通过()设置行和列值。

样本应该是这样的

Matrix(1,1) = 10;

假设第 1 行第 1 列将设置为 10。

我的附加重载示例如下

friend Matrix operator +(Matrix&, Matrix&);

我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • 有点不相关:您的加法运算符应该是:Matrix operator +(Matrix const&, Matrix const&);。否则,像x + y + z 这样的东西就行不通了。您可以在operator overloading FAQ 中阅读更多相关信息。
  • @R.MartinhoFernandes 你能详细说明区别吗?
  • 当然。 Matrix& 只能绑定到左值(如果您不知道那是什么,就说“命名变量”,这并不完全正确,但很接近)。 x + y + zoperator+(operator+(x,y),z) 相同。内部调用返回一个不是左值的临时对象,因此不能传递给Matrix&。 OTOH Matrix const& 可以绑定到左值和临时值。
  • 为什么要包含加法运算符的朋友声明?我看不出它与你的问题有什么关系。如果有任何运算符声明是相关的,那么它将是operator()
  • 这是我的() 运营商:double& operator ()(int, int);

标签: c++ class operator-overloading


【解决方案1】:

您的矩阵应该提供元素访问器,例如通过operator():

template <typename T>
class Matrix
{
public:
    T & operator()(size_t i, size_t j) { return buf[i * NCols + j]; } // Example
    T const & operator()(size_t i, size_t j) const { /* same */ }

    // ...
};

那么你可以说:

Matrix<bool> m(20, 20);

m(12, 15) = false;
m(8, 19) = m(1, 2) = true;
return m(0, 0);

【讨论】:

  • 谢谢,Kerrek!我对 C++ 比较陌生,你能详细说明一下模板的含义/是什么吗?
  • @AustinBrunkhorst:我可以,但不是在评论中,也不比任何一本好书更好。不要害怕,潜入并享受:-)
  • 没有模板有没有办法做到这一点?我正在努力与我已有的内容保持一致,但很难将其融入课堂。
  • @AustinBrunkhorst:是的,当然,只需删除模板并将您的具体类型替换为 T 无处不在。
  • 我明白这一点,它设置了我的数组键值,我无法用这个例子弄清楚。我想从运算符重载中设置 values[row][column]。对不起,我缺乏理解。顺便说一句,我非常感谢你的帮助。
【解决方案2】:

这和你已经做过的类似:

Value &operator()(int x, int y)
{
    return matrix[x][y]; // or whatever it's supposed to be
}

,其中Value 是您的内部类型。

但是,我建议改用 setter 函数,因为它的歧义性要小得多。例如:

void set(int x, int y, Value v)
{
    matrix[x][y] = v;
}

【讨论】:

  • 他试图设置矩阵中的一个值,而不是对两个矩阵执行操作。
  • 我正在尝试设置给定矩阵的值。如上所述,我已经有这个重载。我想要类似Matrix(row,column) = value;
  • +1 这是完全正确的。他说“这和你已经做过的很相似”,这让你很困惑@CollinHockey,因为他的代码与operator+ 的代码有点不同,而且不容易从代码中推断出来。 @AustinBrunkhorst,函数返回非常量 Value&amp; 的事实意味着您可以分配给引用指向的内存位置。 (不幸的是,这意味着您必须返回用户可以分配的内存位置,这与具有 []= 运算符的更现代的脚本语言(如 Ruby)不同。)
  • @jli:语言的语法要求operator[] 只接受一个参数,所以你没有那个选项。
  • @jli:这很重要。您不想规定数据如何在内部存储,并且创建列和行视图可能应该留给单独的显式接口。 (如row(size_t)col(size_t)。)
【解决方案3】:

使用

class Matrix {

    T& operator()(size_t x, size_t y) {
        return _mat[x][y]; //Or however your datastructure works
    }

    const T& operator() (size_t x, size_t y) const {
        return _mat[x][y];
    }


};

其中 T 是您的矩阵所包含的数据类型。返回 (x,y) 处的数据。

【讨论】:

    猜你喜欢
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多