c++ - 下标赋值重载

标签 c++ c++11

我在 C++ 中创建了一个 class Poly,它具有如下定义的私有(private)成员。

private:
 std::size_t sz;
 std::vector  <T>  elem;

重载赋值运算符和/或下标运算符以将值赋给容器元素的标准方法是什么?例如:

  Poly < double > obj{1, 2, 3};
  obj[1] = 1;

应该将值 1 赋给第二个元素。

实现这一点的一种方法可能是:

 T & operator[](int i) {
   if(i < 0 || i >= sz)
     throw std::out_of_range{"Poly::operator[]"};
   return elem[i];
 }

然而,这通过引用返回元素并且赋值是在类之外完成的,而不是由成员函数完成的。私有(private)成员是在对象外访问的,这不违反抽象原则吗?此外,无法确保检查不变量,也就是说,假设我们对可以分配的值有限制。

我宁愿有一个成员函数,例如:

void assign_val(T val, int idx)
{
//Check if the conditions hold...
//...
elem[idx]=val;
}

下标阅读:

  const T & operator[](int i) const{
   if(i < 0 || i >= sz)
     throw std::out_of_range{"Poly::operator[]"};
   return elem[i];
 }

可以使用运算符重载获得这种效果吗?

最佳答案

不,你无法做到这一点。通过使用运算符,如果要为其赋值,则必须公开对变量的引用。此过程中不涉及函数调用,它通过在内存中提供实际存储值的位置来保持。

关于c++ - 下标赋值重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229320/

相关文章:

c++ - 为什么只有一个参数的可变参数模板与非可变参数模板不同?

c++ - "for each"是微软特有的吗?

C++11 文件流

c++ - 避免等待 SwapBuffers

c++ - 指针运算 Visual Studio C++

c++ - Qt 调试器控制台看不到调试 session

c++ - 何时使用 `static_assert` 而不是 SFINAE?

c++ - 缩小从 char 到 uint8_t 的转换

c++ - C++ 中的贪吃蛇游戏 : the snake head does not move as expected

c++ - 在glsl中初始化全局变量?