Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
49 / 2 / 0
Регистрация: 26.09.2014
Сообщений: 98

трудности с пониманием синтаксиса на примере реализации паттерна "стратегия"

21.12.2016, 10:26. Показов 1309. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <string>
  
// Иерархия классов, определяющая алгоритмы сжатия файлов
class Compression
{
  public:    
    virtual ~Compression() {}
    virtual void compress( const string & file ) = 0;
};
  
class ZIP_Compression : public Compression
{
  public:
    void compress( const string & file ) {
        cout << "ZIP compression" << endl;
    }
};
  
class ARJ_Compression : public Compression
{
  public:
    void compress( const string & file ) {
        cout << "ARJ compression" << endl;
    }
};
  
class RAR_Compression : public Compression
{
  public:
    void compress( const string & file ) {
        cout << "RAR compression" << endl;
    }
};
  
  
// Класс для использования
class Compressor 
{
  public:
    Compressor( Compression* comp): p(comp) {}
   ~Compressor() { delete p; }
    void compress( const string & file ) {
      p->compress( file);
    }
  private:
    Compression* p;
};
  
  
int main()
{
  Compressor* p = new Compressor( new ZIP_Compression);
  p->compress( "file.txt");
  delete p;
  return 0;
}
Мне не понятно место, где описывается параметризованный конструктор класса Comressor. Т.е. понятно, что как параметр конструктора объявляется указатель comp на абстрактный класс Compression. Но что это: ": p(comp)"? Сама запись, начиная с двоеточия не понятна. Зачем в private объявлять аналогичную переменную р а потом p(comp). На мой, еще неопытный, взгляд, инициализация Compressor* p = new Compressor( new ZIP_Compression) и без записи(не понятной мне) : p(comp) правильна. предполагаю,что это какие-то ... нет, ничего не предполагаю)
Объясните, пожалуйста. Желательно хорошенько разжевать даже всякие очевидные и тривиальные вещи.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2016, 10:26
Ответы с готовыми решениями:

Реализация паттерна Стратегия
У меня задание, нужно реализовать паттерн Стратегия на примере моей программы, читал про сам паттерн, но не совсем понимаю, как реализовать...

Применение паттерна Стратегия
Здравствуйте, помогите пожалуйста доработать программу. Рассматривала паттерн Стратегия, программа у нас вычисляет интегралы, используя...

Трудности с пониманием MVVM
Делал пример: Реализация MVVM. ViewModel | METANIT.COM Добавил кнопку для получения списка выбранных файлов &lt;Button...

4
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
21.12.2016, 11:17
Цитата Сообщение от Maks53 Посмотреть сообщение
Но что это: ": p(comp)"?
А в учебник заглянуть вам религия не позволяет?
Это список инициализации конструктора.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.12.2016, 11:42
Лучший ответ Сообщение было отмечено Maks53 как решение

Решение

Цитата Сообщение от Maks53 Посмотреть сообщение
Но что это: ": p(comp)"?
Цитата Сообщение от Maks53 Посмотреть сообщение
Сама запись, начиная с двоеточия не понятна
Для вашего уровня понимания будет достаточно, что записи
C++
1
  Compressor( Compression* comp): p(comp) {}
и
C++
1
2
3
4
  Compressor( Compression* comp)
{
p = comp;
}  {}
являются идентичными по конечному результату - в класс-мембер указателе каждого объекта будета будет необходимый указатель на некоторую сущность, которая умеет что-то сжимать.

Цитата Сообщение от Maks53 Посмотреть сообщение
Зачем в private объявлять аналогичную переменную р а потом p(comp).
Чтобы запомнить указатель на объект
C++
1
2
3
Compressor* p1 = new Compressor( new ZIP_Compression);
Compressor* p2 = new Compressor( new ARJ_Compression );
Compressor* p3 = new Compressor( new RAR_Compression );
Вот пример где каждый объект запоминает, что ему в конструкторе передали и дальше через p2-> можно работать с верным компресором


Цитата Сообщение от Maks53 Посмотреть сообщение
Желательно хорошенько разжевать
Я думаю, что вам рано читать паттерны - если вы посмотрите карту книг для чтения https://tproger.ru/news/how-to... ng-scheme/ вы заметите, что сами паттерны открываются программисту, когда он может решить 90% простых задач, что перед ним поставят. Вам же сейчас советую прочитать про четыри кита ООП и двигаться от этого.
2
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
21.12.2016, 12:16
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вам же сейчас советую прочитать про четыри кита ООП
Ну, перед этим основы-то языка не грех выучить!
2
21.12.2016, 12:50

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, перед этим основы-то языка не грех выучить!
не помешало бы :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.12.2016, 12:50
Помогаю со студенческими работами здесь

Трудности с пониманием условия
В соответствии с индивидуальным заданием, разработать структуру базового класса и наследников (не менее 3-х производных классов на двух...

Проблемы с пониманием синтаксиса
Я сейчас переписываю один алгоритм с javascript на другой язык, но так как с js вообще незнаком бывают затупы. Вот сейчас я завис на одной...

Трудности с пониманием значений атрибутов SMART
Не могу понять почему в строке с ID 190 порогом является 45 градусов? Что если температура упадёт ниже накопителю хреново будет? Бред...

Трудности с пониманием алгоритма фибоначчиева поиска
Не понимаю, что означает &quot;Обмен (P,H) с (H,P-H)&quot;. Какие действия нужно выполнить?

Трудности с пониманием доказательств простой теоремы
Чтобы наверстать пробелы с своём образовании решил научиться доказывать теоремы и для начала выбрал планиметрию, так как она не настолько...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru