crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в class QPushButton вместо include <QPushButton>
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 12.2.2011, 12:47
  Резюме:
Если класс наследник другого, то заголовочник от базового всё равно нужно включать. И т.д.
Т.е. те ограничения которые я написал, будут действовать всегда и для всех описанных случаев.
Алексей1153 Дата 11.2.2011, 11:22
 
Цитата(kwisp @ 11.2.2011, 12:58) *
по-моему вы ребята уже предвзято к друг другу относитесь

ни грамма ))
kwisp Дата 11.2.2011, 10:58
  по-моему вы ребята уже предвзято к друг другу относитесь. это по градусу сообщения видно. :)
опять же по-моему ТС разницу между форвардами и инклюдами понял. цель достигнута. это хорошо.

П.С.
что касается моего ответа. Юрию, я наверное действительно не понял, что в точности он спрашивал, и в ответе написал как уйти от включения заголовочника в заголовочник....

Алексей1153 Дата 10.2.2011, 20:10
  igor_bogomolov, мы просто напросто в ненужные дебри полезли )) А в целом не всё так трагично, как ты воспринимаешь
Rocky Дата 10.2.2011, 20:04
  igor_bogomolov, спасибо, хоть ты понял что я пытался сказать :)
igor_bogomolov Дата 10.2.2011, 19:34
  to Алексей1153
Цитата(Litkevich Yuriy @ 9.2.2011, 6:19) *
Если же ты используешь класс для наследования, или для создания переменной на стеке (обычной) или используешь члены некого класса, то придётся использовать инклюд. Иначе компилятор не будет ничего знать об особенностях класса.
Цитата(Алексей1153 @ 10.2.2011, 8:16) *
class QMyLineEdit;
struct QMyLineEditWrapper
{    
    QMyLineEdit* p;    
    QMyLineEditWrapper(QWidget* parent=0);
};
Не увидел в приведенном коде не наследования, ни создания переменной на стеке ни использования членов другого класса.
Юрий пытался объяснить ТС при каких условиях можно использовать предварительное объявление, при каких нет. Ты же как как всегда перевернул всё с ног на голову.

to Алексей1153, to kwisp
Да в пимпл без предварительного объявления никуда, и поговорить про это интересно. Вот только ТС спрашивал не про это.
Тут скорее можно было написать, что в некоторых случаях без предварительного объявления не обойтись, и показать это на примере пимпла. А вот говорить что можно отнаследоваться от класса class QMyLineEdit:public QLineEdit не сделав в том же файле includ не правильно.

to Алексей1153
Цитата
Цель пимпла: сделать содержимое хидера реально видимым только в файле реализации
Ты путаешь цели и средства достижения цели. То о чем ты говоришь - это средство/способ решения, а цели у пимпла другие.
Алексей1153 Дата 10.2.2011, 12:21
 
Цитата(Rocky @ 10.2.2011, 13:51) *
Алексей1153, ты вырываешь слова из контекста

да нет, не вырываю. Ты , во-первых, сам их жирным выделил. Ну а включать надо - это факт :) вопрос в том - куда включать. Где хидер будет виден только локально, либо же торчать повсюду

Цель пимпла: сделать содержимое хидера реально видимым только в файле реализации. Это его единственный плюс (но как раз он иногда требуется).
А вот если у тебя есть большой массив элементов, и ты вдруг захотел сделать его массивом указателей, а класс ячейки засунул по паттерну pimpl в реализацию, то тут сильно проиграешь в скорости работы и фрагментации кучи. Поэтому в этом случае лучше разместить в реализации весь массив как единый объект и дописать интерфейсные методы для работы с ним извне

Цитата(Rocky @ 10.2.2011, 13:51) *
Просто есть люди, которые где надо и не надо лепят наследование, думая, что без него никак

ну, по затратам памяти и скорости (кхм) наследование абсолютно ничем не отличается от включения мембера с классом, какой был бы у класса-родителя. Но тут становится недоступен или труднодоступен полифорфизм
Rocky Дата 10.2.2011, 11:51
 
Цитата(Алексей1153 @ 10.2.2011, 12:33) *
Цитата(Rocky @ 10.2.2011, 13:28) *
хидер включать необходимо

да, но включать его надо уже только в файл реализации

Алексей1153, ты вырываешь слова из контекста. Если есть класс В, который наследуется от класса А, то хидер класса А обязательно нужно включать в хидере класса В. То что пишешь ты - да. Но если ты будешь наследоваться от QMyLineEditWrapper - тебе опять-таки нужно будет включение хидера с этой структурой. От этого никуда не уйти. А как я понял твою задумку, то что ты сделал - это ответ на вопрос

Цитата(Алексей1153 @ 10.2.2011, 12:33) *
Цитата('я')
Наследование можно опять-таки заменить через указатель (практически всегда).


оу, расскажи, как ?.

из которого следует, что да, в этом случае достаточно будет предварительного объявления. Но это не обход
Цитата
Если есть класс В, который наследуется от класса А, то хидер класса А обязательно нужно включать в хидере класса В

это обход наследования.

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

Хотя, вероятно я придираюсь к словам :) Фсё, больше не буду))
Алексей1153 Дата 10.2.2011, 11:33
  Rocky,
Цитата(Rocky @ 10.2.2011, 13:28) *
хидер включать необходимо

да, но включать его надо уже только в файл реализации :)

Цитата(Rocky @ 10.2.2011, 13:28) *
А в чем приведенный код Алексей1153, kwisp, позволяет обойти

а обходить в данном случае не нужно. Это было сказано о случае СУРОВОЙ необходимости )) То есть - костыль

Цитата(Rocky @ 10.2.2011, 13:28) *
Наследование можно опять-таки заменить через указатель (практически всегда).

оу, расскажи, как ?. Особенное внимание удели конструктору, деструктору и виртуальным функциям
Rocky Дата 10.2.2011, 11:28
 
Цитата(Алексей1153 @ 9.2.2011, 10:03) *
Цитата(Litkevich Yuriy)

Если же ты используешь класс для наследования, или для создания переменной на стеке (обычной) или используешь члены некого класса, то придётся использовать инклюд.

...но при суровой необходимости и это можно обойти

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

Может я жестко туплю конечно, либо придираюсь... А в чем приведенный код Алексей1153, kwisp, позволяет обойти то, о чем говорит Litkevich Yuriy? То что вы приводите, называется паттерн проектирования пимпл - ака идиома скрытой реализации. Мне кажется это не есть обход в том смысле в котором имеется ввиду.

Ведь можно не создавать объект на стеке в капсуле класса, а использовать указатель на него. Наследование можно опять-таки заменить через указатель (практически всегда). И тогда тоже не нужно будет подключать хидер с капсулой класса в своем хидере. Вопрос ведь какой, как сделать так, чтобы при наследовании или создании объекта класса на стеке не нужно было включать хидер класса. Держу пари что как-то можно. Но схоу не могу сообразить. Вероятно, тут будет что-то из жесткого хака (типа define private public)...
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 14:29