Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
 Аватар для KnockKnock
1 / 1 / 1
Регистрация: 04.11.2012
Сообщений: 11
1

Массив указателей на классы

07.11.2012, 12:58. Показов 4905. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, понять ситуацию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
enum COLOR {RED, GREEN, BLUE};
 
class Shape
{
protected:
    int m_x, m_y;
    COLOR m_color;
public:
    Shape(int x = 0, int y = 0, COLOR c = RED);
    virtual ~Shape(void);
    virtual void WhereAmI(void); // { cout << "In class Shape"; }
};
 
class Rect : public Shape
{
    int m_right, m_bottom;
 
public:
    Rect (int left = 0, int top = 0, int right = 0, int bottom = 0, COLOR c = RED);
    virtual ~Rect(void);
 
    virtual void WhereAmI(void); // { cout << "In class Rect"; }
};
 
int main ()
{
    Shape* pShapes = new Rect[10]; //1)
    Rect* pRects = new Rect[10]; //2)
 
    for (int i = 0; i < 10; i ++)
    {
        pShapes[i].WhereAmI (); //тут ошибки для i > 0
        pRects[i].WhereAmI (); // тут всё ок
 
    }
}
Почему первый вариант вызывает ошибку? Как правильно понимать эту конструкцию?
Создаём указатель базового класса на массив из 10 объектов производного класса?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2012, 12:58
Ответы с готовыми решениями:

Массив указателей на неродственные классы
Возможно ли создать массив указателей на экземпляры классов, не имеющих общего родительского?

Массив указателей на производные классы
Здравствуйте, есть базовый класс строка mystring class mystring // Опишем базовый класс...

Классы. Наследование, массив указателей, очистка памяти
Разбираюсь с классами в си++. Имеется следующий код: header.h ...... class Circle :public...

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до...

10
 Аватар для igorrr37
2862 / 2010 / 988
Регистрация: 21.12.2010
Сообщений: 3,716
Записей в блоге: 15
07.11.2012, 15:15 2
потому что цикл for шагает по массиву объектов Shape (т.к. указатель на Shape), в то время как в массиве содержатся объекты Rect(а размеры Shape и Rect разные). Можно привести указатель
C++
1
dynamic_cast<Rect*>(pShapes)[i].WhereAmI ();
2
 Аватар для KnockKnock
1 / 1 / 1
Регистрация: 04.11.2012
Сообщений: 11
07.11.2012, 15:43  [ТС] 3
О, спасибо! Про преобразование типа указателя я не подумал...

Добавлено через 12 минут
Что-то я запутался... Как в данном случае вообще работает массив? При i=1 при преобразовании типа указателя считается правильное смещение относительно pShape? Тогда почему не работает такое вот:
C++
1
(pShapes + i*sizeof(Rect))->WhereAmI ();
В таком духе вообще можно получить нужный результат?
0
 Аватар для igorrr37
2862 / 2010 / 988
Регистрация: 21.12.2010
Сообщений: 3,716
Записей в блоге: 15
07.11.2012, 16:15 4
Думаю что нет. Это попытка подсунуть компилятору число байт на которые надо сместить указатель, но он принимает только тип указателя и число шагов i, и по этим параметрам сам вычисляет число байт для смещения. При i == 0 срабатывает правильно потому что указатель на виртуальную таблицу находится по адресу объекта(в самом начале объекта) .
1
 Аватар для KnockKnock
1 / 1 / 1
Регистрация: 04.11.2012
Сообщений: 11
07.11.2012, 17:14  [ТС] 5
Ага, понятно, спасибо. Грубо говоря в теории, видимо, можно подобрать нужное количество байт, если очень приспичит... Это я так, для себя

И последнее: вот если такой вариант

C++
1
2
3
4
5
    Shape* ar[]={new Shape, new Rect, new Rect(r) };
        for (int i = 0; i < sizeof(ar)/sizeof(Shape*); i ++)
        {
            ar[i]->WhereAmI (); 
        }
Тут просто указатель на массив с указателями, вполне строгого размера, потому всё работает без преобразований (как и расчет максимального значения i), верно?

Добавлено через 27 минут
+совсем последнее
корректно чистить память так?
C++
1
2
3
4
5
Shape* pShapes = new Rect[10];//1)
Rect* pRects = new Rect[10];//2)
 
delete[] pShapes;
delete[] pRects;
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
07.11.2012, 20:16 6
Цитата Сообщение от KnockKnock Посмотреть сообщение
Тут просто указатель на массив с указателями, вполне строгого размера, потому всё работает без преобразований (как и расчет максимального значения i), верно?
Да, указатели занимают в памяти одинаковое количество памяти.
Цитата Сообщение от KnockKnock Посмотреть сообщение
корректно чистить память так?
Да. Выделяете память под массив, освобождаете с помощью delete []
1
 Аватар для KnockKnock
1 / 1 / 1
Регистрация: 04.11.2012
Сообщений: 11
07.11.2012, 20:30  [ТС] 7
Благодарю
0
 Аватар для igorrr37
2862 / 2010 / 988
Регистрация: 21.12.2010
Сообщений: 3,716
Записей в блоге: 15
07.11.2012, 21:13 8
да, однотипные указатели(на объекты, на ф-ции) имеют одинаковый размер поэтому такой цикл отработает. Освобождение правильное т.к. деструктор виртуальный.
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
07.11.2012, 21:17 9
Цитата Сообщение от igorrr37 Посмотреть сообщение
да, однотипные указатели(на объекты, на ф-ции) имеют одинаковый размер поэтому такой цикл отработает. Освобождение правильное т.к. деструктор виртуальный.
А можно пример не однотипных указателей, которые имеют разный размер?
0
 Аватар для igorrr37
2862 / 2010 / 988
Регистрация: 21.12.2010
Сообщений: 3,716
Записей в блоге: 15
07.11.2012, 22:21 10
Croessmah, насколько я понял стандарт такое не запрещает
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
07.11.2012, 22:33 11
Все указатели имеют одинаковый размер.

Разный размер будет разве что если указателями считать и так называемые smart pointers.

Добавлено через 12 минут
Ну, хотя если говорить строго, то да. Там нет ничего, что говорило бы об одинаковом представлении указателей на разные типы. Возможность каста к void* и обратно косвенно намекает на это, но всё же не гарантирует.
1
07.11.2012, 22:33
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2012, 22:33
Помогаю со студенческими работами здесь

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

Массив из указателей на масив из указателей на массив из int)
Доброго времени суток! Возникла проблема - как на C++ создать массив из указателей на массив из...

Использование указателей, классы, наследование
Абсолютное незнание темы и завалы на учебе не дают начать исправлять эту задачу на предмет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
Объекты и их имена
hw_wired 28.01.2025
Введение: Основы объектного подхода и их роль в информатике В современном мире информационных технологий объектный подход стал фундаментальным принципом организации и обработки информации. Этот. . .
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru