C ++数组类,带有用于赋值的函数运算符

时间:2014-12-05 16:33:29

标签: c++ multidimensional-array operator-overloading

我想编写自己的2d数组类。我希望类能够为这样的元素赋值。

a(0,0) = 1

我知道这一定是可能的,因为我可以使用blazeeigen中的矩阵类来实现。我的第一个想法是重载函数运算符(),它已经很好地访问元素。当我尝试使用a(0,2) = 0;分配值时,我收到编译器错误。

lvalue required as left operand of assingment

我有什么操作员可以重载分配也有效?

3 个答案:

答案 0 :(得分:8)

您需要使用此原型构建一个函数:

T& operator()(std::size_t, std::size_t);

T是您的元素类型。此函数需要将引用返回到数组中的元素。这允许您通过调用者中的该引用修改元素的值。

除上述内容外,您还应该提供功能

const T& operator()(std::size_t, std::size_t) const;

用于只读元素访问。我宁愿教条地坚持std::size_t进行索引。实际上,您可能希望自己的typedef代表索引类型。

答案 1 :(得分:1)

您需要提供两个重载 - 一个const而另一个不重载,返回引用。例如:

template <typename TVal> class val {
  std::map<int, TVal> values;

public:
  // the distinction is between a const version ...
  TVal operator()(int key) const {
    auto found = values.find(key);
    if (found != values.end())
      return found->second;

    return TVal();
  }

  // ... and a non-const, returning a reference
  TVal& operator()(int key) {
   return values[key];
  }
};

然后您可以按如下方式使用它:

val<int> v;
v(1) = 41;
v(1)++;
std::cout << v(1) << std::endl; // -> 42
std::cout << v(2) << std::endl; // -> 0

答案 2 :(得分:0)

请发布编译错误,让其他人看到并准确回答。

话虽如此,我很确定这是因为您没有从运营商处返回引用。