Предописание базового класса

Из Google dev docs

Lighthouse собирает каждое изображение BMP, JPEG и PNG на странице, а затем преобразует каждое в WebP. Lighthouse исключает изображение из своего отчета, если потенциальная экономия составляет менее 8 КБ.

blockquote>

Также рекомендуется использовать запасные другие браузеры, которые не поддерживают форматы следующего поколения. Одним из таких подходов является использование ссылки Modernizr -> на Google docs

Существует также ответ SO с различными вариантами реализации

]

15
задан Melebius 9 August 2017 в 05:43
поделиться

6 ответов

Первая проблема Вы не можете решить.

Вторая проблема - ничто, чтобы сделать со стандартными классами библиотеки. Это - потому что Вы объявляете экземпляр класса как член Вашего собственного класса.

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

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

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

И при этом это не стоит делать для чего-то как std::string. Во-первых, это, как предполагается, удобная обертка вокруг символьного буфера, сохраняет Вас от выполнения управления памятью на чем-то настолько простом. Если Вы затем держите указатель на него, только для предотвращения включая заголовок, Вы, вероятно, берете хорошую идею слишком далеко.

Во-вторых (как указано в комментарии), std::string определение типа к std::basic_string<char>. Таким образом, необходимо передать, объявляют (и затем используйте), что вместо этого, которым вещи времени становятся очень неясными и твердыми читать, который является другим видом стоимости. Это действительно стоит того?

25
ответ дан 1 December 2019 в 01:11
поделиться

Как отвечено прежде Earwicker, Вы не можете использовать предописания ни в одном из тех случаев, поскольку компилятор должен знать размер класса.

Можно только использовать предописание в ряде операций:

  • объявление функционирует, которые посещают вперед заявленный урок как параметры, или возвращает его
  • объявление членских указателей или ссылок на вперед заявленный класс
  • объявление статических переменных вперед заявленного типа в определении класса

Вы не можете использовать его для

  • объявите членский атрибут данного типа (компилятор требует размера),
  • определите или создайте объект типа или удалите его
  • назовите любой статический метод или членский метод класса или доступа любым участником или статическим атрибутом

(я забывал кого-либо?)

Примите во внимание то объявление auto_ptr не то же как объявление необработанного указателя, начиная с auto_ptr инстанцирование попытается удалить указатель, когда это выйдет из объема, и удаление требует полного объявления типа. Если Вы используете auto_ptr в содержать вперед заявленный тип необходимо будет обеспечить деструктор (даже если пустой), и определите его после того, как полное объявление класса было замечено.

Существует также некоторая другая тонкость. Когда Вы вперед объявляете класс, Вы говорите компилятору, что это будет класс. Это означает, что не может быть enum или a typedef в другой тип. Это - проблема, которую Вы получаете, когда Вы пытаетесь передать, объявляют std::string, поскольку это - определение типа определенного инстанцирования шаблона:

typedef basic_string<char> string; // aproximate

Для передачи объявляют строку, которую необходимо было бы передать, объявляют basic_string обработайте по шаблону и затем создайте typedef. Проблема состоит в том, что в стандарте не говорится количество параметров это basic_string шаблон берет, он просто указывает, что, если требуется больше чем один параметр, там отдых параметров должен иметь тип по умолчанию так, чтобы выражение выше компиляций. Это означает, что нет никакого стандартного пути к тому, чтобы вперед объявить шаблон.

Если, с другой стороны, Вы хотите передать, объявляют нестандартный шаблон (не STL, который является), можно сделать это столько, сколько Вы действительно знаете количество параметров:

template <typename T, typename U> class Test; // correct
//template <typename T> class Test; // incorrect even if U has a default type

template <typename T, typename U = int> class Test {
   // ...
};

В конце, совет, который был дан Вам Roddy: вперед объявите столько, сколько Вы можете, но предполагать, что должны быть включены некоторые вещи.

7
ответ дан 1 December 2019 в 01:11
поделиться

Вы пытаетесь слишком трудно решить что-то, что не является на самом деле проблемой. Используйте заголовочные файлы, в которых Вы нуждаетесь и уменьшаете - ГДЕ ВОЗМОЖНЫЙ - требование для них. Но не пытайтесь взять его к экстремальным значениям, потому что Вы перестанете работать.

В некоторых случаях идиома PIMPL может помочь Вам, но не здесь.

2
ответ дан 1 December 2019 в 01:11
поделиться

В обоих случаях компилятор должен знать размер типа. Поэтому предописание не будет достаточно. Базовый класс мог добавить участников или потребовать виртуальной таблицы. Строковый участник потребовал бы, чтобы размер класса был увеличением для хранения размера строкового класса STL.

Передайте объявление, что классы STL часто нецелесообразны, так как реализации обычно включают явные шаблонные инстанцирования, которые ускоряют компиляцию.

2
ответ дан 1 December 2019 в 01:11
поделиться

Для Ваших базовых классов у Вас должно быть полное определение типа, не только объявление. Для заголовков производного типа будет нужен к #include заголовок для их базовых классов.

Для классов в пространстве имен станд. необходимо включать надлежащий заголовок - <строку> в этом случае - и затем сделать одну из 3 вещей:

  1. Полностью определите тип: станд.:: строка aStringToTest

  2. Поместите объявление использования для просто что тип: использование станд.:: строка;

  3. Вставьте объявление использования для пространства имен станд.: использование станд. пространства имен;

1
ответ дан 1 December 2019 в 01:11
поделиться

> Кажется, что предописание бесполезно для базовых классов и stl классов.

Исправление... Предописание является НЕСООТВЕТСТВУЮЩИМ для базовых классов и элемента объекта. (Это не "бесполезно", это является "неподходящим".)

Базовый класс ДОЛЖЕН быть объявлен (не, передают объявленный), будучи объявленным как основанный класс другого класса.

Элемент объекта ДОЛЖЕН быть объявлен (не, передают объявленный), будучи объявленным другим классом, или как параметр, или как возвращаемое значение.Примечание: ссылкой или указателем не имеет того ограничения.

Исправление... Предописание классов STL - согласно ISO 14882 - неопределенное поведение. http://www.gotw.ca/gotw/034.htm

1
ответ дан 1 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

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