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

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

01.10.2014, 19:16. Показов 6917. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.10.2014, 19:28
Цитата Сообщение от Zaspir Посмотреть сообщение
Ведь по идее в этом коде "SimpleCat * Frisky = new SimpleCat" создается указатель Frisky на класс SimpleCat и выделяется для этого класса участок в динамически распределяемой памяти (т.е. создается экземпляр класса).
В этом коде создается объекта класса SimpleCat (в динамической памяти), на стеке выделяется память под указатель (Frisky) на объект класса SimpleCat и адрес объекта класса SimpleCat, размещенного в динамической памяти, инициализирует значение указателя на стеке (Frisky).

По идее, после того как ты осознаешь вышесказанное, все остальные вопросы должны отпасть.
2
5499 / 4894 / 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
9005 / 4706 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.10.2014, 21:59
Цитата Сообщение от Zaspir Посмотреть сообщение
Книга не электронная, постараюсь завтра выложить фото этой страницы. Извиняюсь, но сканера в ближайшее время у меня не будет.
Большие у меня сомнения, что в книге так написано.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
5499 / 4894 / 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
5499 / 4894 / 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru