Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Maks53
0 / 0 / 0
Регистрация: 26.09.2014
Сообщений: 38
#1

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

21.12.2016, 10:26. Просмотров 812. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2016, 10:26
Ответы с готовыми решениями:

Ошибки в примере:"newline in constant"и"unexpected end of file while looking for precompiled header directive"
здравствуйте. учусь по книге Шилдта там такой пример( да и везде впринципе...

Ошибки "Expression syntax" и "Unreachable code" при реализации класса матриц
Подскажите по коду. #include &lt;iostream.h&gt; #include &lt;math.h&gt; #include...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить...

Собственная реализация паттерна "Слушатель" - нужна конструктивная критика
Добрый день, наворотил код по работе с паттерном слушатель - есть класс...

Поясните принцип работы паттерна "абстрактная фабрика"
это паттерн &quot;абстрактная фабрика &quot; .Просьба пояснить каждую строчку #include...

4
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
21.12.2016, 11:17 #2
Цитата Сообщение от Maks53 Посмотреть сообщение
Но что это: ": p(comp)"?
А в учебник заглянуть вам религия не позволяет?
Это список инициализации конструктора.
1
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
21.12.2016, 11:42 #3
Лучший ответ Сообщение было отмечено 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-learn-programming-scheme/ вы заметите, что сами паттерны открываются программисту, когда он может решить 90% простых задач, что перед ним поставят. Вам же сейчас советую прочитать про четыри кита ООП и двигаться от этого.
2
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
21.12.2016, 12:16 #4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вам же сейчас советую прочитать про четыри кита ООП
Ну, перед этим основы-то языка не грех выучить!
2
rikimaru2013
21.12.2016, 12:50     трудности с пониманием синтаксиса на примере реализации паттерна "стратегия"
  #5

Не по теме:

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

0
21.12.2016, 12:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2016, 12:50
Привет! Вот еще темы с ответами:

Стратегия "получение ресурса есть инициализация"
Здорова! Тут вообщем новую концепцию ООП вычитал &quot;получение ресурса есть...

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru