Здравствуйте.
Вот делаю класс по сути дела аналог динамического массива.
при инициализации одномерного массива и выборки из него элементов проблем не возникло:
Здравствуйте, black_claster, Вы писали:
_>Здравствуйте. _>Вот делаю класс по сути дела аналог динамического массива. _>при инициализации одномерного массива и выборки из него элементов проблем не возникло:
_>clas DM _>{ _> public: _> DM(); _> ~DM(); _> char& operator[] (int position); _> char *POINT; _> char **POINT_2; _> void init(int number); _> void init2(int i,intj); _>} _>DM::DM() _>{ _> memset(this,0,sizeof(DM)); _>} _>DM::~DM() _>{ _> delete POINT; _>}
_>void DM::init(int number) _>{ _> POINT=new char[number]; _>} _>void DM::init2(int i,int j) _>{ _> POINT2=new char[i]; _> for(int n=0;n<i;n++) _> { _> POINT2[n]=new char[j]; _> } _>} _>char& operator[] (int position) _>{ _> if(position<=MAX_SIZE)return POINT[position];
_>}
_>и в программе соответственно можно записать так:
_>DM NP; _>NP.init(9); _>NP[0]='t';
_>А вот как сделать так чтобы можно было оперировать в двумерном случае, _>т.е. _>DM NP; _>NP.init(5,5);
_>NP[1][2]='n';
_>я не знаю.
_>Подскажите пожалуйста как переопределить оператор выборки для случая двойного массива.
_>Заранее благодарен.
Или делать прокси, в которой тоже определен [], или довольствоваться GetAt(int x, int y);
Здравствуйте, black_claster, Вы писали:
_>Здравствуйте. _>Вот делаю класс по сути дела аналог динамического массива. _>при инициализации одномерного массива и выборки из него элементов проблем не возникло: _>... _>А вот как сделать так чтобы можно было оперировать в двумерном случае,
Зачем?
_>т.е. _>DM NP; _>NP.init(5,5); _>NP[1][2]='n'; _>я не знаю. _>Подскажите пожалуйста как переопределить оператор выборки для случая двойного массива.
Двойного или двумерного?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
_>Или делать прокси, в которой тоже определен [], или довольствоваться GetAt(int x, int y);
Совершенно необязательно. Если элементы в памяти лежат построчно, то подойдет обычный operator[](int row) возвращающий указатель на элемент в начале строки
Только адресация будет не [x][y] а как и в обычном Си [row][col]
Вторая [] обработается автоматически — как с обычным указателем. Но если нужен контроль выхода за границу -- то только через прокси.
Здравствуйте, Ytz, Вы писали:
Ytz>Здравствуйте, black_claster, Вы писали:
_>>Подскажите пожалуйста как переопределить оператор выборки для случая двойного массива.
_>>Заранее благодарен.
Ytz>Тебе надо использовать прокси-класс. Можешь прочесть об этом в правиле 30 книги Мэерса 35 правил программирования на С++.
А каков механизм взятия числа из вторых скобок?
Можете пожалуйста кинуть ссылочку с примером?
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, black_claster, Вы писали:
_>>Здравствуйте. _>>Вот делаю класс по сути дела аналог динамического массива. _>>при инициализации одномерного массива и выборки из него элементов проблем не возникло: _>>... _>>А вот как сделать так чтобы можно было оперировать в двумерном случае, V>Зачем?
_>>т.е. _>>DM NP; _>>NP.init(5,5); _>>NP[1][2]='n'; _>>я не знаю. _>>Подскажите пожалуйста как переопределить оператор выборки для случая двойного массива. V>Двойного или двумерного?
двумерного.
И вот еще не ясно как быть-класс предпологает использование как одномерного так и двумерного массива,
а переопределение оператора [] должно быть одно на оба случая?
Здравствуйте, black_claster, Вы писали:
_>И вот еще не ясно как быть-класс предпологает использование как одномерного так и двумерного массива, _>а переопределение оператора [] должно быть одно на оба случая?
Моэно сделать специализацию. Но, вообще-то, мне лично больше нравится использование круглых скобок.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, black_claster, Вы писали:
_>Здравствуйте, Ytz, Вы писали:
Ytz>>Здравствуйте, black_claster, Вы писали:
_>>>Подскажите пожалуйста как переопределить оператор выборки для случая двойного массива.
_>>>Заранее благодарен.
Ytz>>Тебе надо использовать прокси-класс. Можешь прочесть об этом в правиле 30 книги Мэерса 35 правил программирования на С++.
_>А каков механизм взятия числа из вторых скобок? _>Можете пожалуйста кинуть ссылочку с примером?
Книгу я тебе подсказал, возьми да прочитай, там как раз это рассматривается.
Здравствуйте, black_claster, Вы писали:
_>>>Здравствуйте. _>>>Вот делаю класс по сути дела аналог динамического массива. _>>>при инициализации одномерного массива и выборки из него элементов проблем не возникло: _>>>... _>>>А вот как сделать так чтобы можно было оперировать в двумерном случае, V>>Зачем? _>>>т.е. _>>>DM NP; _>>>NP.init(5,5); _>>>NP[1][2]='n'; _>>>я не знаю. _>>>Подскажите пожалуйста как переопределить оператор выборки для случая двойного массива. V>>Двойного или двумерного? _>двумерного. _>И вот еще не ясно как быть-класс предпологает использование как одномерного так и двумерного массива, _>а переопределение оператора [] должно быть одно на оба случая?
Вопрос, зачем это нужно вообще, когда можно просто перевести все размерности в одну?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, black_claster, Вы писали:
_>Подскажите пожалуйста как переопределить оператор выборки для случая двойного массива.
Определи operator () с двумя аргументами и не страдай. Причем в некотором смысле это правильнее, чем [] — ведь любой массивоподобный объект есть по сути отображение множества индексов на множество значений, так что пользоваться им как функцией вполне логично.
вдогонку. Может быть вы изобретаете свой велосипед, посмотрите в сторону valarry, ваша задача может быть реализована на простом одномерном динамическом массиве, а реализация "многомерности" осуществляется через внутреннее индексирование этого массива
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, black_claster, Вы писали:
_>>И вот еще не ясно как быть-класс предпологает использование как одномерного так и двумерного массива, _>>а переопределение оператора [] должно быть одно на оба случая?
E>Моэно сделать специализацию. Но, вообще-то, мне лично больше нравится использование круглых скобок.
Здравствуйте, Lexey, Вы писали:
L>Здравствуйте, black_claster, Вы писали:
_>>Вот делаю класс по сути дела аналог динамического массива.
L>Про то, как надо, уже много написали. Добавлю немного про то, как не надо. :D
L>
L>За такое молотком по рукам бить нужно. Если завтра у класса появится база или автоматически конструируемые члены, то будет очень весело.
L>
_>>DM::~DM()
_>>{
_>> delete POINT;
_>>}
L>
L>И за такое тоже. Массив нужно удалять через delete[], а не через скалярный delete. L>И кто POINT2 будет удалять?
L>И вообще, все это сильно смахивает на изобретение очередного велосипеда с квадратными колесами.
... делает следующее: сперва аллоцирует массив из i char (1 байт),
а затем присваивает каждому из них указатель char* (4 байта в 32-бит. системе)
на создаваемые массивы, из-за чего реальные адреса их теряются и память "утекает". =)
Надо исправить на " POINT2=new char*[i]; ".
... надо сравнивать не с константой MAX_SIZE, а с реальным количеством выделенных в функции init() элементов. И return по умолчанию добавить (без него не скомпилится), а лучше else с генерацией исключения. %)