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

С++ идиомы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Внедрение DLL в EXE http://www.cyberforum.ru/cpp/thread1787895.html
Здравствуйте, хочу написать свой объединитель exe и dll. Подскажите, как это можно сделать так, чтобы можно было при запуске использовать dll без записи на диск
C++ Как создать оконную программу на c++ exe Можно по подробние как создать оконную программу на c++ exe . Я только что перешол на c++ из Bash (cmd , bat , командная строка ) и как то не хочется опять возвращатся к консольным программам . Я... http://www.cyberforum.ru/cpp/thread1787737.html
Парсинг журнала событий C++
возникла задача, получить некоторые данные из event log'a Windows, как это все реализовать ? с чего начать?
Не выделяется память C++
Здравствуйте, пытаюсь выделить память, на одном компьютере работает, на другом нет, возвращает 0x00000000, хотя память имеется в наличии. В чём может быть причина? size_t size = 1586753967;...
C++ Стек и куча http://www.cyberforum.ru/cpp/thread1786739.html
Вот говорят, что для стека доступного места меньше, чем для кучи. И если есть много переменных большого размера, то лучше создавать их через new. а почему так?
C++ Программа для отправки сообщения Привет всем. Может кто помочь? Задача следующая. Есть сервер, к которому подключается 10 человек. На этом сервере лежат 10 именных папок (по имени участника). Когда кто-то один из участников... подробнее

Показать сообщение отдельно
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
02.08.2016, 08:12  [ТС]
Pointer To Implementation (pImpl)

Идиома "pointer to implementation" (pImpl) также называется "opaque pointer" (дословный перевод "непрозрачный указатель"), это способ предоставления данных и в еще один уровень абстракции в реализации классов.

В С++ вы должны написать декларацию переменных-членов класса внутри определения класса, эти члены должны быть публичны (прим. переводчика - думаю речь идет об интерфейсе, иначе зачем членам быть публичными) и поскольку для членов выделяется память абстракция реализации не возможна для "всех" классов.
Тем не менее, за счет дополнительного указателя и вызова функции, вы можете иметь такой уровень абстракции через указатель на реализацию.

Допустим вы написали такой класс:
C++
1
2
3
4
5
6
7
class Book
{
public:
  void print();
private:
  std::string  m_Contents;
}
Кто-то, кто работает с классом Book должен знать лишь о методе print(), но что произойдет если вы хотите добавить больше деталей в ваш класс:
C++
1
2
3
4
5
6
7
8
class Book
{
public:
  void print();
private:
  std::string  m_Contents;
  std::string  m_Title;
}
В этом случае все, кто используют ваш класс, должны перекомпилировать свой код, несмотря на то, что они по прежнему используют только вызов метода print().

pImpl может реализовывать следующий паттерн таким образом, что описанная выше ситуация не является проблемой.
C++
1
2
3
4
5
6
7
8
9
10
11
/* public.h */
class Book
{
public:
  Book();
  ~Book();
  void print();
private:
  class BookImpl;
  BookImpl* m_p;
}
а в отдельном "внутреннем" хедере
C++
1
2
3
4
5
6
7
8
9
10
11
/* private.h */
#include "public.h"
#include <iostream>
class Book::BookImpl
{
public:
  void print();
private:
  std::string  m_Contents;
  std::string  m_Title;
}
Реализация методов класса Book может выглядеть так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Book::Book()
{
  m_p = new BookImpl();
}
 
Book::~Book()
{
  delete m_p;
}
 
void Book::print()
{
  m_p->print();
}
 
/* функции BookImpl */
 
void Book::BookImpl::print()
{
  std::cout << "print from BookImpl" << std::endl;
}
Используем Book в функции main:
C++
1
2
3
4
5
6
int main()
{
  Book *b = new Book();
  b->print();
  delete b;
}
Вы также можете использовать std::unique_ptr<BookImpl> или эквивалент для управления внутренним указателем.
7
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru