Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18

Указатель на объект, или экземпляр класса?

01.10.2014, 19:16. Показов 6991. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте Уважаемые программисты!
Недавно я начал изучать программирование с использованием С++. Ранее не программировал. В качестве источников информации и плана обучения использую книги:
- Джесс Либерти, Брэдли Джонс "Освой самостоятельно С++ за 21 день. Пятое издание." 2008 года;
- Бьерн Страцуступ "Программирование. Принципы и практика использования С++" 2011 года.

Основным учебником для меня является книга Джесса Либерти, т.к. излагаемый там материал, более доступен для моего восприятия (т.к. опыт в программировании нулевой). Я понимаю, что С++ по этой программе я не освою, но начинать с чего то надо, после изучения данного материала, планирую изучать книгу Бьерна Страуступа и т.д. (конечно же не просто изучать, а практиковать программирование в рамках обучающей программы, которую предлагают вышеуказанные авторы).

Решаемая задача:

Учебник Джесса Либерти.День 8-й. Тема: Доступ к переменным-членам. На странице 219 опубликован Листинг 8.6. Обращение к данным-членам объектов, размещенных в динамической памяти.

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
 #include <iostream>
 
 
  #include <stdlib.h>
 
  class SimpleCat
  {
  public:
   SimpleCat() {itsAge = 2;}
   ~SimpleCat() {}
  int GetAge() const {return itsAge;}
  void SetAge(int age) {itsAge = age;}
private:
  int itsAge;
 };
 
int main()
 {
 using namespace std;
  SimpleCat*Frisky=newSimpleCat;
  cout << "Frisky is " << Frisky->GetAge()
           << " years old" << endl;
  Frisky->SetAge(5);
  cout << "Frisky is " << Frisky->GetAge()
               << " years old" << endl;
  delete Frisky;
   return 0; 
}
Результат:
Frisky is 2 years old
Frisky is 5 years old

АНАЛИЗ:
Код строки 20 создает в динамической памяти объект Frisky - экземпляр класса SimpleCat.
Стандартный конструктор устанавливает его возраст равным 2. В строке 21 находится вызов метода GetAge(), позволяющего удостоверится в том, что конструктор сработал нормально. Поскольку речь идет об указателе, для обращения к его данным-членам и функциям, используется оператор косвенного доступа (->). В строке 22 метод SetAge() устанавливает новое значение возраста, а метод GetAge() в строке 23 еще раз выводит его на экран.

Вопрос:
1. Исходя из предыдущей темы данного учебника "Указатели", возникло недопонимание строки 20. Ведь по идее в этом коде "SimpleCat * Frisky = new SimpleCat" создается указатель Frisky на класс SimpleCat и выделяется для этого класса участок в динамически распределяемой памяти (т.е. создается экземпляр класса).
2. Как в данной ситуации создать в динамической памяти объект Frisky класса Cat и как воспользоваться переменными и функциями этого объекта (объект находится в динамически распределяемой памяти).
3. Как создать указатель на объект, ане на класс.
4. Что в действительности происходит в этом коде?

Возможно мои вопросы покажутся смешными, но они возникают в следствии непонимания данного материала и отсутствия опыта в программировании.

Прошу Вас помочь мне в решении возникших вопросов. При составлении ответа, или комментария, прошу учесть мой уровень, в связи с чем убедительно прошу строить ответ наиболее подробно, приводя простейшие примеры.

Надеюсь на вашу поддержку и взаимопонимание.
Также прошу обратить внимание на выбранную мной литературу в качестве обучающего с нуля материала.
Если у вас есть другие предложения по поводу выбора источника обучения - буду вам признателен, если подскажете что-нибудь более подходящее и эффективное.

С Уважением, Александр.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2014, 19:16
Ответы с готовыми решениями:

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

Обращение к методам класса через указатель на экземпляр класса
Добрый день. Не могу осилить проблему: Описан абстрактный класс. Описаны наследники этого класса уже без абстрактности. Описан...

Создание статической функции класса, которая принимает экземпляр этого же класса как объект
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

20
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.10.2014, 19:28
Цитата Сообщение от Zaspir Посмотреть сообщение
Ведь по идее в этом коде "SimpleCat * Frisky = new SimpleCat" создается указатель Frisky на класс SimpleCat и выделяется для этого класса участок в динамически распределяемой памяти (т.е. создается экземпляр класса).
В этом коде создается объекта класса SimpleCat (в динамической памяти), на стеке выделяется память под указатель (Frisky) на объект класса SimpleCat и адрес объекта класса SimpleCat, размещенного в динамической памяти, инициализирует значение указателя на стеке (Frisky).

По идее, после того как ты осознаешь вышесказанное, все остальные вопросы должны отпасть.
2
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.10.2014, 20:42
Цитата Сообщение от Zaspir Посмотреть сообщение
Также прошу обратить внимание на выбранную мной литературу в качестве обучающего с нуля материала.
Цитата Сообщение от Zaspir Посмотреть сообщение
Джесс Либерти, Брэдли Джонс "Освой самостоятельно С++ за 21 день. Пятое издание." 2008 года;
Предложение: "В топку!", часто встречал здесь, на форуме, по поводу этой книги.

Добавлено через 43 секунды
Цитата Сообщение от Zaspir Посмотреть сообщение
АНАЛИЗ:
Ваш или в книге?
Цитата Сообщение от Zaspir Посмотреть сообщение
Код строки 20 создает в динамической памяти объект Frisky - экземпляр класса SimpleCat.
Так в книге?
Добавлено через 1 минуту
Цитата Сообщение от Zaspir Посмотреть сообщение
Если у вас есть другие предложения по поводу выбора источника обучения - буду вам признателен, если подскажете что-нибудь более подходящее и эффективное.
Литература C++
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.10.2014, 20:59
Цитата Сообщение от Zaspir Посмотреть сообщение
Как в данной ситуации создать в динамической памяти объект Frisky класса Cat и как воспользоваться переменными и функциями этого объекта (объект находится в динамически распределяемой памяти).
В приведенном коде это и делается при помощи оператора доступа по указателю - стрелки:
C++
1
Frisky->SetAge(5);
1
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18
01.10.2014, 21:18  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
АНАЛИЗ:
Ваш или в книге?
В книге.

Цитата Сообщение от alsav22 Посмотреть сообщение
Код строки 20 создает в динамической памяти объект Frisky - экземпляр класса SimpleCat.
Так в книге?
В книге.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.10.2014, 21:28
Цитата Сообщение от Zaspir Посмотреть сообщение
В книге.
Скрин, с этим текстом, выложите, если не трудно.
1
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18
01.10.2014, 21:40  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В этом коде создается объекта класса SimpleCat (в динамической памяти), на стеке выделяется память под указатель (Frisky) на объект класса SimpleCat и адрес объекта класса SimpleCat, размещенного в динамической памяти, инициализирует значение указателя на стеке (Frisky).
По идее, после того как ты осознаешь вышесказанное, все остальные вопросы должны отпасть.
Можете ли Вы пояснить вышесказанное, по каждому пункту, опираясь на соответствующие правила?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.10.2014, 21:44
Zaspir, как насчёт скрина?
1
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18
01.10.2014, 21:45  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Скрин, с этим текстом, выложите, если не трудно.
Книга не электронная, постараюсь завтра выложить фото этой страницы. Извиняюсь, но сканера в ближайшее время у меня не будет.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.10.2014, 21:59
Цитата Сообщение от Zaspir Посмотреть сообщение
Книга не электронная, постараюсь завтра выложить фото этой страницы. Извиняюсь, но сканера в ближайшее время у меня не будет.
Большие у меня сомнения, что в книге так написано.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.10.2014, 22:32
Цитата Сообщение от Zaspir Посмотреть сообщение
Как в данной ситуации создать в динамической памяти объект Frisky класса Cat
Никак. Нет такого типа и объекта. Есть тип (класс) SimpleCat, объект этого класса (переменная этого типа) в динамической памяти и указатель с именем Frisky объявленный: SimpleCat * Frisky для связи с объектом. Что бы понять нужно вернутся к простым типам:
C++
1
2
3
int *a = new int (12345);
int b = *a;
cout<<b<<" is copy of  "<<a<<" in stack "<<endl;
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.10.2014, 00:04
Цитата Сообщение от Zaspir Посмотреть сообщение
Можете ли Вы пояснить вышесказанное, по каждому пункту, опираясь на соответствующие правила?
Я лучше на пальцах:
1) Класс - это как чертеж.
2) Объект - это как изделие по этому чертежу.

-------------
Указатель на класс в твоем понимании не может существовать, потому что класс - это сущность описательная, она не существует (тут есть нюанс, но на данном этапе он несущественен) во время выполнения программы, следовательно не может иметь адреса, а следовательно и указателя, содержащего этот адрес. Класс - это метаинформация времени компиляции, о том, как следует создавать и оперировать объектом - указание компилятору что и как располагать в памяти. А вот объект - это воплощение класса, экземпляр. Он располагается в памяти, следовательно имеет адрес, следовательно указатель на объект тоже может существовать. Указатель, кстати, - это тоже объект и у него тоже есть свой собственный адрес.

Объекты в С++ могут хранится в разных местах:
в статической памяти (static storage duration),
на стеке (automatic storage duration),
в динамической памяти (dynamic storage duration),
в области памяти, локальной для потока (thread storage duration).
В скобках верные термины - привыкай к ним
2
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18
02.10.2014, 11:54  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Большие у меня сомнения, что в книге так написано.
к сожалению нет у меня сканера, поэтому выкладываю фото:
Миниатюры
Указатель на объект, или экземпляр класса?   Указатель на объект, или экземпляр класса?  
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2014, 12:06
Я почему сомневался? Беру другие издания этой книги, и там всё правильно написано, а точно такое издание не смог найти. В вашем же издании - явная ошибка.
Миниатюры
Указатель на объект, или экземпляр класса?  
1
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18
02.10.2014, 18:12  [ТС]
alsav22, я прошел по ссылке Литература C++, которую Вы предложили, но книги, предлагаемые в том разделе, не соответствуют моему уровню. А именно. В подразделе Hello Word, подразумевается перечень литературы, ориентированный на новичков, способных приложив немного усилий, написать программу, используя одну директиву, одну основную функцию, в теле которой задействован стандартный поток с оператором вывода символов "Hello Word! ". Конечно же, это не самоцель. Если бы все так и было, было бы действительно замечательно, но авторы тех книг, предполагают наличие начального опыта в программировании. А значит, некоторые моменты для объяснения опускаются. Иначе, при прочтении подобных книг, я не стал бы задавать вопросы, подобные тем, с которого началась моя тема.
У меня к Вам нижайшая просьба, пожалуйста, посоветуйте действительно подходящую для меня литературу. Что бы изучив её, я смог приступить изучение книг Страуступа, Брюса Эккеля и т.д.
Мне нужно хорошее начало.
Заранее благодарю Вас, а также других участников форума, чье мнение и предложения, окажут помощь в освоении программирования на С++.
С Уважением, Александр.
0
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18
02.10.2014, 18:13  [ТС]
Забыл выложить маленький скрин
Миниатюры
Указатель на объект, или экземпляр класса?  
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2014, 18:16
Я по Прата учил, рекомендую: "Прата С. Язык программирования С++ Лекции и упражнения 2011."
Другие другое порекомендуют.
1
1 / 1 / 0
Регистрация: 27.08.2014
Сообщений: 18
02.10.2014, 18:29  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Я по Прата учил, рекомендую: "Прата С. Язык программирования С++ Лекции и упражнения 2011."
Благодарю, уже скачал, надеюсь она будет хорошим стартом для меня.
Миниатюры
Указатель на объект, или экземпляр класса?  
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.10.2014, 19:12
Цитата Сообщение от Zaspir Посмотреть сообщение
посоветуйте действительно подходящую для меня литературу
Можешь еще эту посмотреть: Липпман С. Язык программирования C++. Вводный курс
2
02.10.2014, 20:39

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Можешь еще эту посмотреть: Липпман С. Язык программирования C++. Вводный курс
Мне тоже понравилась.
Стенли Липманн., Лажое Ж. Язык программирования С++ Вводный курс. :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.10.2014, 20:39
Помогаю со студенческими работами здесь

указатель на экземпляр шаблонного класса
имеется такой класс template &lt;class Coord&gt; class Elem { private: const Coord x, y; Elem *Prev; bool check; public: ...

Указатель на экземпляр шаблонного класса
Есть шаблон класса template &lt;typename TBase&gt; class TArray { ... };, есть некие объекты TArray &lt;A&gt; a; TArray &lt;A&gt; b; TArray...

Указатель на текущий экземпляр класса this
Всем здрасьте. Например у меня есть класс: class A { // ... void B(); void C(); // ... }

Использование в качестве поля класса указатель на объект другого класса
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru