Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
#1

В чем преимущество использования Pimpl? - C++

10.06.2012, 11:39. Просмотров 909. Ответов 6
Метки нет (Все метки)

Есть две реализации одной лабораторной. Первая с закрытым наследованием, вторая с использованием Pimpl. Делают одно и тоже. Объясните пожалуйста, зачем использовать Pimpl в чём преимущество? Что это вообще такое.
http://rghost.ru/38581864 --ссылка на эти лабы. как раз можно разобрать по примеру

Добавлено через 3 минуты
те-же методы,что и класса наследника, только почему-то выглядят таким образом:
C++
1
2
3
4
5
    virtual bool unequal(CoordImp &r)=0;
    virtual bool more(CoordImp &r)=0;
    virtual bool less(CoordImp &r)=0;
    virtual bool m_e(CoordImp &r)=0;
    virtual bool l_e(CoordImp &r)=0;
что это за нолики?
зачем это нужно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
10.06.2012, 13:05     В чем преимущество использования Pimpl? #2
Нолики — объявления чистых виртуальных методов. Говорит о том, что методы в данном классе не определены, и, следовательно, класс является абстрактным и может быть только предком для других классов, которые будут реализовывать эти виртуальные методы.

А скачивать и смотреть лабы лень.
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
10.06.2012, 13:14  [ТС]     В чем преимущество использования Pimpl? #3
Я могу и так выложить код, но там много получается. Но если это необходимо для того, чтобы было удобнее объяснять - я выложу.

Добавлено через 6 минут
в абстрактном классе операция ввода объявлена так:virtual void read(istream &t)=0;
в классе наследнике:void read(istream &t);
не могу понять, как написать реализацию данной операции. откуда брать данные. примерно могли бы показать? в классе наследнике такие поля:
int rub;
unsigned char kop;
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
10.06.2012, 13:33     В чем преимущество использования Pimpl? #4
Цитата Сообщение от PinkPink Посмотреть сообщение
Я могу и так выложить код, но там много получается. Но если это необходимо для того, чтобы было удобнее объяснять - я выложу.

Добавлено через 6 минут
в абстрактном классе операция ввода объявлена так:virtual void read(istream &t)=0;
в классе наследнике:void read(istream &t);
не могу понять, как написать реализацию данной операции. откуда брать данные. примерно могли бы показать? в классе наследнике такие поля:
int rub;
unsigned char kop;
Вопрос не в удобстве чтения, мне в принципе лениво читать большие куски кода.
Абстрактный класс — это что-то вроде интерфейса. То есть, он показывает, как можно взаимодействовать с его наследниками, но сам ничего не реализует. Это как картинка окна программы: она показывает, как с программой можно работать, но чтобы работать, нужно поставить саму программу. Абстрактный класс — картинка, класс-наследник — программа.
Реализацию писать как для обычных классов.
grizlik78
Эксперт С++
 Аватар для grizlik78
1890 / 1422 / 104
Регистрация: 29.05.2011
Сообщений: 2,977
10.06.2012, 14:00     В чем преимущество использования Pimpl? #5
Я код лабораторных тоже не смотрел. Но в принципе выгода от использования pimpl заключается в уменьшении взаимозависимости между модулями в большом проекте и, как следствие, уменьшение времени компиляции.
Допустим у нас есть класс A, который необходимо встроить в класс B. Если использовать наследование, то при изменении закрытой части класса A (добавление/удаление приватных переменных и функций, изменение интерфейса приватных функций) придётся перекомпилировать все модули, которые включают определения классов А и B. Если использовать pimpl, то перекомпилировать придётся только модуль с реализацией класса A. Платой является некоторое (в большинстве случаев незначительное или даже нулевое) снижение производительности за счёт дополнительного уровня (что-то слова подходящего не подберу) косвенности что ли...
Ну и в pimpl нередко упрятывают платформо-зависимый код.
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
10.06.2012, 14:03  [ТС]     В чем преимущество использования Pimpl? #6
Большое спасибо! Понятно. Возможно немного позже возникнут вопросы по поводу реализации. Сейчас пока всё получается С вводом данных тоже кажется разобралась
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2012, 14:29     В чем преимущество использования Pimpl?
Еще ссылки по теме:

В чем преимущество объявления прототипов классов в хедере? C++
C++ Разработать безопасный класс с идиомой pimpl
Нюансы использования оператора запятая или что такое UB и с чем его едят C++
C++ В чем преимущество list над вектором?
C++ В чем ошибка использования rand() в программе

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
10.06.2012, 14:29     В чем преимущество использования Pimpl? #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Платой является некоторое (в большинстве случаев незначительное или даже нулевое) снижение производительности за счёт дополнительного уровня (что-то слова подходящего не подберу) косвенности что ли...
Это копейки.

Пимпл отлично себя зарекомендовал, являясь мембером классов. Но его нельзя использовать при построении архитектуры. Ты не можешь создать предварительное объявление класса, а потом от него унаследоваться.

Другой недостаток - сложности в сопровождении и поддержании интерфейса оберегаемого класса.

Пример:

Есть класс CWork
Этот класс унаследован от целой пачки чевотов, и несет на борту кучу всякого функционала.
Теперь, нужно его начинку упрятать при помощи pimpl.
Вызовы CWork делегируются pimpl.

Но что делать с предками CWork? Они должны быть известны на этапе компиляции. И ничем не закрыты. Смысл тогда прятать одного CWork, если нельзя спрятать всех его предков?

К тому же, если у кого нибудь из предков изменится функционал, он автоматически изменится у CWork, а вот pimpl об это уже не узнает... эпик-фейл.
Yandex
Объявления
10.06.2012, 14:29     В чем преимущество использования Pimpl?
Ответ Создать тему
Опции темы

Текущее время: 10:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru