Форум программистов, компьютерный форум CyberForum.ru

Массив указателей на объекты - C++

Восстановить пароль Регистрация
 
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
22.11.2014, 21:40     Массив указателей на объекты #1
Доброго времени суток.
В моем коде базовый класс имеет два наследника. Четвертый класс содержит динамический массив указателей на наследники. Проблема в работе с массивом.

C++ (Qt)
1
2
Element **mas = new Element*[size]; // element - базовый класс, наследники - А и В
mas[0].Number =0; // тут компилятор пишет, что значение перед точкой должно быть классом или структурой.
Как я понимаю, память выделилась, но объектов как таковых нет. Подскажите, как сделать правильно и как вообще работать с такими массивами. В учебниках просто все примеры в общем виде и внимание авторов возможные проблемы не концентрируется.
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
23.11.2014, 05:32     Массив указателей на объекты #2
Цитата Сообщение от luigration Посмотреть сообщение
Как я понимаю, память выделилась, но объектов как таковых нет.
память выделили только под указатели, под объекты никто не выделял места.
Цитата Сообщение от luigration Посмотреть сообщение
тут компилятор пишет, что значение перед точкой должно быть классом или структурой.
потому что mas[0] - это указатель, а значит, селектор надо другой "->"
C++
1
mas[0]->Number =0;
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.11.2014, 05:57     Массив указателей на объекты #3
Так как объектов ещё нет, то перед
C++
1
mas[0]->Number =0;
надо ещё раз применить new, но уже
C++
1
mas[0]=new Element;
,
C++
1
2
3
4
for (i=size-1; i>=0; --i)
{
 mas[i]=new Element;
}
,
C++
1
2
3
4
for (i=size-1; i<size; --i) // только для беззнаковых типов, так как условие использует переполнение типа, а при переходе через ноль оно происходит только у беззнаковых
{
 mas[i]=new Element;
}
,
C++
1
mas[0]=new Element;
,
C++
1
2
3
4
for (i=0; i<size; ++i)
{
 mas[i]=new Element;
}
,
C++
1
2
3
4
for (p=mas+size-1; p>=mas; --p)
{
 *p=new Element;
}
,
C++
1
2
3
4
for (p=mas; p<mas+size; ++p)
{
 *p=new Element;
}
,
C++
1
2
3
4
for (p=mas; p<=mas+size-1; ++p)
{
 *p=new Element;
}
, или
C++
1
2
3
4
for (p=mas, last=mas+size-1; p<=last; ++p)
{
 *p=new Element;
}
.

Добавлено через 2 минуты
Во всех случаях можно при создании объектов вместо Element писать его потомков, а при создании самого массива лучше не надо и декларировать указатель на сам массив надо именно от базового класса.
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
23.11.2014, 12:25  [ТС]     Массив указателей на объекты #4
Цитата Сообщение от Croessmah Посмотреть сообщение
память выделили только под указатели, под объекты никто не выделял места.

потому что mas[0] - это указатель, а значит, селектор надо другой "->"
C++
1
mas[0]->Number =0;
Черт возьми, точно. Это же указатели. Спасибо.

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Так как объектов ещё нет, то перед
C++
1
mas[0]->Number =0;
надо ещё раз применить new, но уже
C++
1
mas[0]=new Element;
,
C++
1
2
3
4
for (i=size-1; i>=0; --i)
{
 mas[i]=new Element;
}
,
C++
1
2
3
4
for (i=size-1; i<size; --i) // только для беззнаковых типов, так как условие использует переполнение типа, а при переходе через ноль оно происходит только у беззнаковых
{
 mas[i]=new Element;
}
,
C++
1
mas[0]=new Element;
,
C++
1
2
3
4
for (i=0; i<size; ++i)
{
 mas[i]=new Element;
}
,
C++
1
2
3
4
for (p=mas+size-1; p>=mas; --p)
{
 *p=new Element;
}
,
C++
1
2
3
4
for (p=mas; p<mas+size; ++p)
{
 *p=new Element;
}
,
C++
1
2
3
4
for (p=mas; p<=mas+size-1; ++p)
{
 *p=new Element;
}
, или
C++
1
2
3
4
for (p=mas, last=mas+size-1; p<=last; ++p)
{
 *p=new Element;
}
.

Добавлено через 2 минуты
Во всех случаях можно при создании объектов вместо Element писать его потомков, а при создании самого массива лучше не надо и декларировать указатель на сам массив надо именно от базового класса.
Спасибо. Совершенно из головы вылетело.
Yandex
Объявления
23.11.2014, 12:25     Массив указателей на объекты
Ответ Создать тему
Опции темы

Текущее время: 22:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru