Рассмотрим следующий простой класс.
#include <iostream>
using namespace std;
class test
{
public:
int* myvar;
int sz;
test()
{
sz = 10;
myvar = new int[10];
}
void dump()
{
for(int i = 0; i < sz; i++)
{
cout << myvar[i] << " ";
}
cout << endl;
}
int& operator()(int index)
{
if(index >= sz)
{
int* newvar = new int[index+1];
for(int i = 0; i < sz; i++)
{
newvar[i] = myvar[i];
}
sz = index+1;
delete myvar;
myvar = newvar;
}
return myvar[index];
}
const int operator()(int index) const
{
if(index >= sz)
{
throw "index exceeds dimension";
}
else
{
return myvar[index];
}
}
};
Он должен вести себя как динамический массив.Я перегружен оператором ().Моя идея заключалась в том, что для присваивания (lvalue) будет вызываться верхняя версия (), а для операции «только для чтения» (rvalue) используется нижняя версия ().Пример кода должен более четко объяснить, что я имею в виду:
int main()
{
test x;
// will give 10 times zero
x.dump();
// assign some values
x(1) = 7;
x(9) = 99;
// will give
// 0 7 0 0 0 0 0 0 0 99
x.dump();
// should give 7
cout << x(1) << endl;
// should give 99
cout << x(9) << endl;
// this will increase the size of myvar to 15 elements and assign a value
x(15) = 15;
// this should give
// 0 7 0 0 0 0 0 0 0 99 0 0 0 0 0 15
x.dump();
// this should throw an exception because x(20) got never assigned a value!
// but instead of calling the lower version of operator() it also calls the
// upper, resulting in x being expanded now to 21 elements.
cout << x(20) << endl;
// will give 21 elements, instead of 16.
x.dump();
return 0;
}
Поэтому я получаю доступ к содержимому myvar
через оператор ().Должна быть возможность назначить значение только для любого элемента, но не должно быть возможности запрашивать значение элемента, которое никогда не было установлено ранее.Я подумал, используя разные версии (), одной из которых должно быть const
, но очевидно, что компилятор всегда использует верхнюю версию моего оператора, а не нижнюю.Как я могу решить эту проблему?
Я читал о прокси-объекте, например, здесь , но я думаю, что эта реализация не будет работать в моем случае, потому что я использую массив.Итак, а) возможно ли это без прокси-сервера или, если нет, б) как должен выглядеть прокси-сервер в моем случае?