I have a question about Operator Overloading in C++.
For an assignment, I have to write a class which encompasses an array, sort of like the ArrayList in Java.
One of the things I have to do is keep track of the size of the array. Size is the amount of elements included, whereas capacity is the maximum amount which CAN be included before the class has to expand the array.
Client code specifies the size when they call the constructor. However, when new elements are added, I have to figure out a way to change the size.
My teacher said something about being able to overload an operator for different sides of an equality. Is this a real thing, or did I misunderstand her? If this works, it would be the optimal solution to my problem.
My current overloading for the [] operator is:
int & ArrayWrapper::operator [] (int position){
if(position == _size){
if(_size == _capacity){
changeCapacity(_capacity+10);
}
}
return _array[position];
}
This works fine for retrieval, but I’d like to have it so that if someone calls it from the left hand side of a ‘=’ then it checks to see if it needs to expand the size or not.
EDIT: If this isn’t a real thing, can anyone think of a different solution to the problem? One solution I thought of is to have the getSize() method just go through the entire array every time it is called, but I’d really rather not use that solution because it seems cheesy.
EDIT: For clarification, I’m not asking whether or not my expansion of an array works. I need to add 1 to size every time a new element is added. For example, if the client creates an array of size 15 and capacity 25, and then tries to add something to Array[15], that SHOULD increase the size to 16. I was wondering if there was a way to do that with overloading.
A simple approach, which doesn’t quite do what you want, is to overload on whether the array is
constor mutable.This doesn’t distinguish between whether the array is being used on the left-hand side of assignment (as a lvalue) or on the right (as a rvalue); just on whether it’s allowed to be modified or not.
If you really want to tell whether you’re being assigned to or not, then you’ll have to return a proxy for the reference. This overloads assignment to write to the array, and provides a conversion operator to get the value of the element:
You probably need to declare this a
friendofArrayWrapper; then just return this fromoperator[]: