【发布时间】: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 << arr[i] << endl;更改为cout << (*arr)[i] << endl;。您根本不应该为这种情况使用指针。 -
还有The Rule of Three; “我重载了返回数组中元素地址的 [] 运算符。” - 不,它返回一个引用。如果您使用
size_t进行索引和大小,则无需检查负数。
标签: c++ arrays arraylist operator-overloading dynamic-memory-allocation