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

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

01.10.2014, 19:16. Показов 6904. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru