我创建了一个Container类,并将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)
并且使用a[i]
它只打印,则它仅打印从0到9的数字一个随机数。为什么呢?
答案 0 :(得分:3)
T& operator[](size_t index)
{
return value;
}
实际上,因为你没有任何东西可以应用索引(在你的情况下唯一有效的索引是0 - 或者从另一个角度来看,在上面的实现中,任何索引都会返回相同的值,所以&amp; ; [0] ==&amp; a [1]将适用 - 这可能在语法上是正确的,但违反了索引运算符的语义...),解除引用运算符会更合适:
T& operator*() { return value; }
T& operator->() { return value; }
也可以添加赋值运算符(将替换setValue):
Container& operator=(T const& value) { this->value = value; return *this; }
答案 1 :(得分:1)
排队
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[]