【问题标题】:C++ array class with function operator for assignment带有函数运算符的 C++ 数组类用于赋值
【发布时间】:2014-12-05 16:33:29
【问题描述】:

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

a(0,0) = 1

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

lvalue required as left operand of assingment

我必须重载哪个运算符才能使赋值也起作用?

【问题讨论】:

  • 你必须返回一个参考。

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


【解决方案1】:

你需要用这个原型构建一个函数:

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

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

除了上面的,你还应该提供函数

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

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

【讨论】:

    【解决方案2】:

    您需要提供两个重载 - 一个 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
    

    【讨论】:

    • P.S.我的回答有点晚了(见@Bathsheba 的回答)。至于int vs size_t:需要知道所需的密钥类型是什么——是否是无符号范围
    【解决方案3】:

    请将编译错误贴出来,让其他人看到并准确回答。

    话虽如此,我很确定这是因为您没有从操作员返回引用。

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 2012-04-23
      • 2021-11-27
      • 2011-07-17
      • 1970-01-01
      • 2017-11-14
      • 2020-08-14
      • 1970-01-01
      • 2012-01-07
      相关资源
      最近更新 更多