gpt4 book ai didi

c++ - 运算符重载 : C++

转载 作者:搜寻专家 更新时间:2023-10-31 01:52:40 24 4
gpt4 key购买 nike

我对 C++ 中的运算符重载有疑问。

对于一项作业,我必须编写一个包含数组的类,有点像 Java 中的 ArrayList。

我必须做的一件事是跟踪数组的大小。大小是包含元素的数量,而容量是类必须扩展数组之前可以包含的最大数量。

客户端代码在调用构造函数时指定大小。但是,当添加新元素时,我必须想办法改变大小。

我的老师说过能够为等式的不同边重载运算符。这是真的吗,还是我误会她了?如果这可行,那将是解决我的问题的最佳方案。

我当前对 [] 运算符的重载是:

int & ArrayWrapper::operator [] (int position){

if(position == _size){
if(_size == _capacity){
changeCapacity(_capacity+10);
}
}
return _array[position];
}

这对于检索非常有效,但我希望拥有它,以便如果有人从“=”的左侧调用它,那么它会检查是否需要扩展大小。

编辑:如果这不是真的,有人能想出不同的解决方案吗?我想到的一种解决方案是每次调用 getSize() 方法时只遍历整个数组,但我真的不想使用该解决方案,因为它看起来很俗气。

编辑:为澄清起见,我不是在询问我的数组扩展是否有效。每次添加新元素时,我都需要在 size 上加 1。例如,如果客户端创建一个大小为 15 且容量为 25 的数组,然后尝试向 Array[15] 添加一些内容,则应该将大小增加到 16。我想知道是否有一种方法可以通过重载来做到这一点。

最佳答案

一种简单的方法,它并不能完全满足您的要求,它是根据数组是 const 还是可变的来重载。

这不区分数组是在赋值的左侧(作为左值)还是在右侧(作为右值)使用);只是关于是否允许修改。

// Mutable overload (returns a mutable reference)
int & operator[](size_t position) {
if (position >= _size) {
if (position >= _capatity) {
// increase capacity
}
// increase size
}
return _array[position];
}

// Const overload (returns a value or const reference)
int operator[](size_t position) const {
if (position >= _size) {
throw std::out_of_range("Array position out of range");
}
return _array[position];
}

如果你真的想知道你是否被分配给或没有,那么你必须返回一个代理作为引用。这重载了写入数组的赋值,并提供了一个转换运算符来获取元素的值:

class proxy {
public:
proxy(ArrayWrapper & array, size_t position) :
_array(array), _position(position) {}

operator int() const {
if (_position >= _array._array._size) {
throw std::out_of_range("Array position out of range");
}
return _array._array[_position];
}

proxy & operator=(int value) {
if (_position >= _size) {
if (_position >= _capatity) {
// increase capacity
}
// increase size
}
_array._array[_position] = value;
return *this;
}

private:
ArrayWrapper & _array;
size_t _position;
};

您可能需要将其声明为 ArrayWrapper friend ;然后从 operator[] 返回:

proxy ArrayWrapper::operator[](size_t position) {
return proxy(*this, position);
}

关于c++ - 运算符重载 : C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12266582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com