#include using namespace std; class EIncorrectOperation { }; class Array; class Element; class Meta { public: virtual Array& operator[](int) = 0; virtual operator Element() = 0; virtual Meta& operator=(int) = 0; virtual operator int() = 0; }; class Array { private: Meta *data; public: Array(); virtual ~Array(); Array& operator[](int idx); operator Element(); Array& operator=(int e); operator int(); }; class SubArray: public Meta { private: Array *arr; public: SubArray(); ~SubArray(); Array& operator[](int idx); operator Element(); Meta& operator=(int e); operator int(); }; class Element: public Meta { private: int data; public: Array& operator[](int); operator Element(); operator int(); Meta& operator=(int e); }; Array::Array(): data(0) { } Array::~Array() { if (data) delete data; } Array& Array::operator[](int idx) { if (!data) data = new SubArray; return ((*data)[idx]); // we should catch bad indices (< 0 or >= 10)... one more if () is needed } Array::operator Element() { if (!data) data = new Element; return (*data); } Array& Array::operator=(int e) { if (!data) { data = new Element; } *data = e; return (*this); } Array::operator int() { if (!data) data = new Element; return ((int)(*data)); } SubArray::SubArray() { arr = new Array[10]; } SubArray::~SubArray() { delete[] arr; } Array& SubArray::operator[](int idx) { return (arr[idx]); // and here, and here too } SubArray::operator Element() { throw EIncorrectOperation(); } Meta& SubArray::operator=(int e) { throw EIncorrectOperation(); } SubArray::operator int() { throw EIncorrectOperation(); } Array& Element::operator[](int) { throw EIncorrectOperation(); } Element::operator Element() { return (*this); } Element::operator int() { return (data); } Meta& Element::operator=(int e) { data = e; return (*this); } int main() { Array A; A[2][3] = 4; A[7] = 14; A[1][2][3][4][5][6][7] = 8; cout << A[2][3] << " " << A[7] << " " << A[1][2][3][4][5][6][7] << endl; return (0); }