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

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

Восстановить пароль Регистрация
 
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
10.06.2012, 11:39     В чем преимущество использования Pimpl? #1
Есть две реализации одной лабораторной. Первая с закрытым наследованием, вторая с использованием 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;
что это за нолики?
зачем это нужно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2012, 11:39     В чем преимущество использования Pimpl?
Посмотрите здесь:

использования функцый C++
В чем преимущество рекурсивных функций? C++
Преимущество Win Api C++
C++ использования операторов
Варианты использования c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
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++ Статическая и динамическая линковка - в чем преимущество каждой?
В чем преимущество объявления прототипов классов в хедере? C++

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

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

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

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

Пример:

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

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

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

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