运算符重载和设置值
Operator overloading and setting values
我创建了一个容器类,并将new关键字与指针结合使用,以了解它的工作原理以及如何使用它。
template<typename T>
class Container {
private:
T value;
public:
Container(T value) {
this->value = value;
}
Container() {
}
virtual ~Container() {
}
T getValue() {
return value;
}
void setValue(T value) {
this->value = value;
}
void operator[](T value) {
this->value = value;
}
};
int main() {
std::vector<Container<int>*> arr(10);
for (int i = 0; i < 10; i++) {
Container<int> *a = new Container<int>;
a->setValue(i);
// a[i];
arr[i] = a;
std::cout << arr[i]->getValue() << std::endl;
delete a;
}
return 0;
}
[]
运算符与setValue()
具有相同的代码,但是如果我使用a->setValue(i)
,它只会打印从 0 到 9 的数字,并且使用a[i]
它只打印一个随机数。为什么?
- 请参阅Sly_TheKing的答案(将索引运算符应用于指针(。
- 索引运算符旨在访问某个引用的特定偏移量处的值。它应该接受有符号或无符号整数值并返回一些特定的值。因此,要有效,运算符应如下所示:
T& operator[](size_t index)
{
return value;
}
实际上,由于您没有任何可以应用索引的内容(在您的情况下,唯一有效的索引是 0 – 或者从另一个角度来看,通过上述实现,任何索引都将返回相同的值,因此 &a[0] == &a[1] 将适用 - 这可能在语法上是正确的,但违反了索引运算符的语义...... 取消引用运算符会更合适:
T& operator*() { return value; }
T& operator->() { return value; }
可能,你也可以添加一个赋值运算符(将替换 setValue(:
Container& operator=(T const& value) { this->value = value; return *this; }
in line
Container<int> *a = new Container<int>;
您将a
初始化为指针,因此使用此行
a[i];
您只需访问一些存储在a
和偏移量i * sizeof(container<int>)
中存储地址的内存
所以正确的用法是
std::vector<Container<int>*> arr(10);
for (int i = 0; i < 10; i++) {
Container<int> *a = new Container<int>;
(*a)[i];
arr[i] = a;
std::cout << arr[i]->getValue() << std::endl;
delete a;
}
使用(*a)[i];
您可以访问您在课堂上编写operator[]
相关文章:
- 重载C++中的[]运算符以支持自定义设置函数
- 运算符重载和设置值
- unordered_set使用重载运算符=设置转换
- 设置器不适用于重载运算符
- 重载>>运算符未在输入上设置属性
- 方括号重载运算符来设置而不是获取 c++
- 重载C++设置插入
- 为什么重载运算符不将主对象设置为值集
- 使用 SWIG 在重载C++方法中设置类型
- 重载支架运算符 [] 获取和设置
- 是否可以在不重载的情况下为每个函数设置可变数量的参数
- 在名称包含 WinDBG 中的空格的重载函数处设置断点
- 设置的重载运算符
- 正确重载 [括号] 运算符用于哈希表获取和设置
- 标准重载运算符<:设置(英语:SET)
- []c++中获取和设置操作的运算符重载
- 设置(C++)和运算符<重载
- 重载c++中的下标[]操作符来设置类(量词)的大小
- 使用重载下标运算符"[ ]"获取数组并将其设置为数组的值将不起作用
- GDB:警告:重载方法上设置了多个断点