![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Товарищи, подскажите пожалуйста.
В хидере класса я объявляю указатель на массив указателей, типа вот так: int** data; или надо вот так: int* data[]; Но в этом случае компилятор ругается, что надо определить размер массива, тогда я пишу так: int* data[size]; в этом случае выдает варнинг Подскажите пожалуйста как правильно вообще это организовать Вот пример кода: class My { public: My(int SIZE=100); ~My(); private: size;// размер массива указателей int* data[size];// массив указателей // или надо int** data??? }; А в файле .cpp в конструкторе мне надо инициализировать массив указателей нулями, т.е. NULL. Я не пойму как это сделать, толи в .cpp явно инициализировать массив указателей(его размер и на что они в данный момент указывают,т.е. NULL), то ли просто писать в конструкторе что-то типа : ... My::My(int SIZE) :size(SIZE) { for(int i=0;i<size;i++) data[i]=NULL; } ... Дело в том, что если я так пишу, то операционка выдает что-то типа: попытка записи в защищенную память, и аварийно завершает программу. Прошу пожалуйста помочь, как правильно мне это организовать Спасибо всем. Очень ценю мнение каждого. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
я их инициализирую нулями
data[i]=NULL; |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
data = NULL; Ваш вопрос представляет кучу вариантов для толкования... И ответить на него кратко, не зная основной задачи (*) не получится. (*) для чего вобще Вы собираетесь использовать указ. на массив указ.? двухмерный массив ? Добавлено @ 13:23 как Вы можете инициализировать "их", если не знаете где "они" расположены ?! Вы сами написали: так что , чтоб работать с массивом_указатeлей, нужно вначале проинициализировать указатель_на_массив_указателей. Это сообщение отредактировал(а) mes - 26.2.2009, 13:26 |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
А какую область памяти ты инициализируешь нулями ? ты под указатели не выделил память вот тебе и ошибка.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
вообщем, это нужно для создания простой базы данных, в ней имеется указатель на объекты(объектов много, для простоты пусть они будут типа int )
|
|||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
Как я понял size здесь не константа, заранее не известен, поэтому
class My { public: My(int SIZE=100); ~My(); private: size;// размер массива указателей int** data;// массив указателей // или надо int** data??? }; My::My(int SIZE) :size(SIZE) { data = new *int[size]; for(int i=0;i<size;i++) data[i]=NULL; } My::~My() { ...... delete data[]; } |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Мне кажется Вы злоупотребляете словом "указатель" - и из за этого проблемы с пониманием того чего хотите получить. Вам нужен линейный контейнер для хранения объектов ? 1. std::vector<T> v; - рекомендуемая альтернатива динамическому си-массиву. 2. T mas[size]; - статический массив 3. T* mas; mas = new Т[size]; - динамический массив, скрытый за указателем. где Т - Ваш тип Это сообщение отредактировал(а) mes - 26.2.2009, 13:40 |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
спасибо Всем, начал понимать.
А могу я сделатьтак: class My { public: My(int SIZE=100); ~My(); private: size;// размер массива указателей [b] int** ptrData;// указатель на массив указателей int* data[];// собственно, сам массив указателей // здесь нужно писать data[] или надо data[размер]???[/B] }; My::My(int SIZE) :size(SIZE) { data = new *int[size]; for(int i=0;i<size;i++) data[i]=NULL; ptrData=data[0]; } My::~My() { ...... delete data[]; } Добавлено @ 13:47 ребята, я что то запутался, если мы пишем int** data это ведь указатель на массив указателей Тогда почему мы инициализируем его типом *int[] так в конструкторе: data = new *int[size]; Это сообщение отредактировал(а) seravr - 26.2.2009, 13:48 |
|||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
В С++ массив и указатель одно и то же. Массив = указателю на первый элемент
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
возьмем для примера массив 4х3, чтобы не было квадратика, а то не поймешь...
опять же для понимания, сейчас у нас вот так 0 1 2 [...] [...] [...] те массив у нас уже есть, а нам нужен массив массивов, те 0 1 2 0 [...] [...] [...] 1 [...] [...] [...] 2 [...] [...] [...] 3 [...] [...] [...] т.е. в кадый из элементов первого массва запихнуть по массиву 0 1 2 [массив] [массив] [массив] это делается вот так
все это только для объяснения, чтобы человек понял... что ваще происходит Это сообщение отредактировал(а) Dmi3ev - 26.2.2009, 14:08 -------------------- |
||||
|
|||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Друзья, как я понял, нужно в хидере объявить int** data;
а в файле .cpp нужно писать data = new int*[size]; т.е. получается что int** data; и int* data[]; -это одно и тоже??? |
|||
|
||||
Carnivore |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 9.12.2008 Где: St.-Petersburg Репутация: нет Всего: нет |
||||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Dmi3ev, преогромнейшее спасибо Вам, разобрался
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |