【问题标题】:Accessing element in custom array wrapper via overloading operator []通过重载运算符 [] 访问自定义数组包装器中的元素
【发布时间】:2017-11-04 16:05:10
【问题描述】:

我正在尝试实现我自己的数组包装器。我重载了返回数组中元素地址的 [] 运算符。但是,当我在 main 中动态分配 ArrayWrapper 类时,它不起作用。

为什么不起作用? 是因为变量 arr 是指针吗?

我收到以下错误:

描述资源路径位置类型无法绑定'std::ostream {aka std::basic_ostream}' 左值到 'std::basic_ostream&&' Cviceni.cpp /Cviceni/src 第 25 行 C/C++ 问题

描述资源路径位置类型不匹配'operator

工作代码

    ArrayWrapper arr(250);

 try
 {
   for(int i = 0; i < arr.getSize(); i++)
   {
     arr[i] = i + 1;
     cout << arr[i] << endl;
   }
}
catch(std::range_error& e)
  {
      cout << e.what() << endl;
  }

  cout << "End..." << endl;

  return 0;
}

无效的代码:

ArrayWrapper *arr = new ArrayWrapper(250);

  try
  {
    for(int i = 0; i < arr->getSize(); i++)
    {
      arr[i] = i + 1;
      cout << arr[i] << endl;
    }
  }

ArrayWrapper 实现:

class ArrayWrapper
{
private:
  int size;
  int *elements;

public:
  ArrayWrapper(int n) : size(n), elements(new int[n])
  {
    for(int i = 0; i < size; i++)
      elements[i] = 0;
  };

  ~ArrayWrapper(){delete []elements;};

  int& operator[](int i)
  {
    if(i >= size || i < 0)
      {
    throw range_error("Out of range");
      }
    return elements[i];
  };

  int getSize(){ return size;};
};

【问题讨论】:

  • 将错误消息复制粘贴到问题本身中。
  • 只需将cout &lt;&lt; arr[i] &lt;&lt; endl; 更改为cout &lt;&lt; (*arr)[i] &lt;&lt; endl;。您根本不应该为这种情况使用指针。
  • 还有The Rule of Three; “我重载了返回数组中元素地址的 [] 运算符。” - 不,它返回一个引用。如果您使用 size_t 进行索引和大小,则无需检查负数。

标签: c++ arrays arraylist operator-overloading dynamic-memory-allocation


【解决方案1】:

是你在第二个例子中使用了指针 arr[2] 不是对 ArrayWrapper 的操作,而是对指针的操作。

ArrayWrapper *arr = new ArrayWrapper(250);

  try
  {
    for(int i = 0; i < arr->getSize(); i++)
    {
      (*arr)[i] = i + 1;
      cout << (*arr)[i] << endl;
    }
  }

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多