C++, возможно, не устранил pimpl идиому?

Guava ComparisonChain :

Collections.sort(list, new Comparator(){
            @Override
            public int compare(ActiveAlarm a1, ActiveAlarm a2) {
                 return ComparisonChain.start()
                       .compare(a1.timestarted, a2.timestarted)
                       //...
                       .compare(a1.timeEnded, a1.timeEnded).result();
            }});

19
задан Frederick The Fool 20 November 2008 в 05:37
поделиться

6 ответов

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

можно моделировать, однако, желаемое поведение следующим:

class MyClass
{
public:
   // public stuff

private:
#include "MyClassPrivate.h"
};

Это не осуществляет поведение, но оно вытаскивает частный материал из.h файла. На вниз стороне, это добавляет другой файл для поддержания. Кроме того, в Visual Studio intellisense не работает на членов парламента, не занимающих официального поста - это могло быть плюс или минус.

9
ответ дан 30 November 2019 в 03:34
поделиться

У кого-то будет намного больше подробного ответа, чем я, но быстрый ответ является двукратным: компилятор должен знать, что все члены структуры определяют требования пространства памяти, и компилятор должен знать, что упорядочивание тех участников генерирует смещения детерминированным способом.

язык является уже справедливо сложным; я думаю, что механизм для разделения определений структурированных данных через код был бы определенным бедствием.

Как правило, я всегда видел , занятия по политике раньше определяли поведение реализации Pimpl-способом. Я думаю, что существуют некоторые дополнительные преимущества использования шаблона политики - легче обменяться реализациями, может легко объединить несколько частичных реализаций в единый блок, которые позволяют Вам разбивать код реализации в функциональные, допускающие повторное использование единицы, и т.д.

6
ответ дан 30 November 2019 в 03:34
поделиться

Вы все игнорируете точку вопроса -

, Почему разработчик должен вывести код PIMPL?

Для меня, лучший ответ, который я могу придумать, - то, что у нас нет хорошего способа выразить код C++, который позволяет Вам воздействовать на него. Например, время компиляции (или препроцессор, или безотносительно) отражение или код DOM.

C++ плохо нужно один или оба из них, чтобы быть доступным разработчику, чтобы сделать метапрограммирование.

Затем Вы могли записать что-то вроде этого в своем общедоступном MyClass.h:

#pragma pimpl(MyClass_private.hpp)

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

7
ответ дан 30 November 2019 в 03:34
поделиться

Я думаю, что здесь существует беспорядок. Проблема не о заголовках. Заголовки ничего не делают (они - просто способы включать общие биты исходного текста среди нескольких файлов исходного кода).

проблема, так же, как существует один, то, что объявления класса в C++ должны определить все, общедоступное и частное, что экземпляр должен иметь для работы. (То же верно для Java, но путь ссылка на работы внешне-скомпилированных-классов делает использование из чего-либо как общие заголовки ненужным.)

Это находится в природе общей Object-Oriented Technologies (не только C++ один), что кто-то должен знать реальный класс, который используется и как использовать его конструктора для обеспечения реализации, даже если Вы используете только общедоступные части. Устройство в (3, ниже) скрывает его. Практика в (1, ниже) разделяет проблемы, делаете ли Вы (3) или нет.

  1. абстрактные классы Использования, которые определяют только общедоступные части, главным образом методы, и позволяют классу реализации наследоваться тому абстрактному классу. Так, с помощью обычной конвенции для заголовков существует abstract.hpp, который совместно используется вокруг. Существует также implementation.hpp, который объявляет наследованный класс, и это только роздано к модулям, которые реализуют методы реализации. implementation.hpp файл будет #include "abstract.hpp" для использования в объявлении класса, которое это делает, так, чтобы была единственная точка обслуживания для объявления абстрактного интерфейса.

  2. Теперь, если Вы хотите осуществить сокрытие объявления класса реализации, у Вас должен быть некоторый способ запросить конструкцию конкретного экземпляра, не обладая определенным, полным объявлением класса: Вы не можете использовать новый, и Вы не можете использовать локальные экземпляры. (Можно удалить все же.) Введение функций помощника (включая методы на других классах, которые обеспечивают ссылки на экземпляры класса) является заменой.

  3. Наряду с или поскольку часть заголовочного файла, который используется в качестве общего определения для абстрактного класса / интерфейс, включайте функциональные подписи для внешних функций помощника. Они функционируют, должен быть реализован в модулях, которые являются частью определенных реализаций класса (таким образом, они видят полное объявление класса и могут осуществить конструктора). Подпись функции помощника, вероятно, во многом как подпись конструктора, но она возвращает ссылку экземпляра в результате (Этот прокси конструктора может возвратить Нулевого указателя, и она может даже выдать исключения, если Вам нравится такая вещь). Функция помощника создает конкретный экземпляр реализации и возвращает его бросок как ссылка на экземпляр абстрактного класса.

Миссия выполняется.

, О, и перекомпиляция и пересоединение должен работать способ, которым Вы хотите, избегая перекомпиляции вызова модулей, когда только изменения реализации (так как модуль вызова больше не делает выделений ресурсов хранения для реализаций).

10
ответ дан 30 November 2019 в 03:34
поделиться

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

, Если бы C++ не поддерживал семантику значения, он был бы прекрасен, но он делает.

3
ответ дан 30 November 2019 в 03:34
поделиться

Да, но...

необходимо считать "Дизайн Stroustrup и Эволюцию C++" книга. Это запретило бы внедрение C++.

2
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: