Название: Наследование Отправлено: ruzik от Февраль 11, 2011, 15:46 Здравствуйте, скажи пожалуйста, что я делаю не правильно
Надо сделать новый класс из QLineEdit Код: #include "QLineEdit" Ошибка 1 error C2011: RizekLineEdit: переопределение типа "class" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RFoundationClasses\RLineEdit.h 3 Ошибка 2 error C2027: использование неопределенного типа "RizekLineEdit" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RFoundationClasses\RLineEdit.h 12 Название: Re: Наследование Отправлено: ilyagoo от Февраль 11, 2011, 16:05 #include <QLineEdit> - так лучше смотрится))
нафига ";" после тела функции? нафига вызов метода предка через this? а это вообще где RizekLineEdit? Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 16:51 Забыл вызвать конструктор базового класса
Код
И где код RLineEdit.h? Название: Re: Наследование Отправлено: ruzik от Февраль 11, 2011, 17:12 Это и есть код RLineEdit.h, а точнее RizekLineEdit.h просто немножко подсократил название перед тем как выкладывать на форум, что бы читать стало легче
Добавил конструктор базового класса, теперь ошибок 28)) Код: #include "QLineEdit" Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 17:17 Похоже компилятор не находит Qt-шных инклюдов.
Название: Re: Наследование Отправлено: Пантер от Февраль 11, 2011, 17:23 ruzik, пользуйся тегом code для оформления постов.
Название: Re: Наследование Отправлено: ruzik от Февраль 11, 2011, 17:27 ruzik, пользуйся тегом code для оформления постов. ИсправилНазвание: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 17:54 Забыл вызвать конструктор базового класса Зачем?) Это важно только если при создании объекта RLineEdit, он в него передаст предка, по умолчанию у виджета он равен 0. Хотя в твоём варианте его передавать надо обязательно.Код
Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 18:00 Цитировать Зачем?) Это важно только если при создании объекта RLineEdit, он в него передаст предка. Интересно, кто-то реально в реальных проектах создаёт контролы без предков?А если укажет предка, то каким образом про него узнает базовый класс? Цитировать Хотя в твоём варианте его передавать надо обязательно. Вовсе нет - смотри описание конструктора.Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 18:03 Под описанием имеется ввиду
Код ? Если да, то не вижу тут ничего похожего на Код
Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 18:06 Вы ссылаетесь на имплементацию, где дефолтные значения непозволительны, а вот описание:
Код
Перед тем как вступать в полемику не мешало бы повнимательнее просмотреть тему) Название: Re: Наследование Отправлено: Fat-Zer от Февраль 11, 2011, 18:07 Это и есть код RLineEdit.h, а точнее RizekLineEdit.h просто немножко подсократил название перед тем как выкладывать методы, надеюсь, определены всё же в cpp файле? И хорошо бы увидеть полный список ошибок под каким-нить спойлеров.Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 18:08 Интересно, кто-то реально в реальных проектах создаёт контролы без предков? Да, потому что addWidget() никто не отменял. В чём подвох?А если укажет предка, то каким образом про него узнает базовый класс? не понял вопросаВы ссылаетесь на имплементацию, где дефолтные значения непозволительны, а вот описание: Код
Перед тем как вступать в полемику не мешало бы повнимательнее просмотреть тему) Я ссылаюсь не на имплементацию, а на конкретный пост #3. Это тоже имплементация?) Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 18:15 Цитировать Я ссылаюсь не на имплементацию, а на конкретный пост #3. Это тоже имплементация?) Конечно. Чего-то я не понимаю ваших непоняток.Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 18:18 Я имею ввиду чем по-вашему плох способ:
Код ? Предка не указал Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 18:30 Цитировать Я имею ввиду чем по-вашему плох способ: Плох тем, что в Qt нет QWidget::addWidget() :)А вот QLayout::addWidget() есть. Но, бывают случаи, когда лейаута может и не быть. С остальном способ не плох, но мне, имхо, не нравится. Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 18:32 конечно я имел ввиду лайауты
Название: Re: Наследование Отправлено: ruzik от Февраль 11, 2011, 18:33 А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту
Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 18:39 Цитировать А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту Дело в том, что инлкюды обычно меняются не так часто, как сами исходники.И если этот класс используется во многих исходниках, то при каждом изменении этого инклюда, будут перекомпиляться эти исходники. Ну и считается, что имплиментацию лучше спрятать от других. Название: Re: Наследование Отправлено: Fat-Zer от Февраль 11, 2011, 18:43 А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту потому что тогда определения попадут во все cpp файлы в которые включается этот хедер и будет 28 ошибок.Если не хотите реализацию писать в отдельном файле, то нужно сделать их встроинными: Код не люблю себя цитировать, но: И хорошо бы увидеть полный список ошибок под каким-нить спойлеров. Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 18:45 Цитировать А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту Дело в том, что инлкюды обычно меняются не так часто, как сами исходники.Код
вместо: Код
иначе изменение MyClass повлекло бы за собой перекомпил класса, который относится к .h Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 18:50 Цитировать Интересует именно: как при этом можно будет создать объект без передачи предка. Т.к. я привык к: Вы чего-то недогоняете( Посмотрите первое сообщение. Там есть описание конструктора с дефолтным предком. Что непенятно-то? :oЦитировать Поэтому и рекомендуется в .h-файлах прописывать: Ну и? Про это разве кто-то спрашивал?Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 18:51 Цитировать Поэтому и рекомендуется в .h-файлах прописывать: Ну и? Про это разве кто-то спрашивал?Название: Re: Наследование Отправлено: GreatSnake от Февраль 11, 2011, 18:56 Цитировать А я разве где-то что-то опроверг? Нет, просто это было подано как-то странно.Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 19:12 Насчёт
Код
Название: Re: Наследование Отправлено: ruzik от Февраль 11, 2011, 19:43 А не подскажите как правильно расписать все подключения и тп в cpp и h файлах, и вообще это надо, я говорю про всякие
#ifndef RLINEEDIT_H #define RLINEEDIT_H ..... #endif В h файле И вообще как компилятор определяет cpp файл, со всеми описаниями если он нигде не подключается(во всяком случае в виде inclide) Название: Re: Наследование Отправлено: Fat-Zer от Февраль 11, 2011, 19:56 порядок компиляции вкратце:
0) компилятор ничего не знает о хедарах 1) препроцессор вместо всех директив подставляет то что должен (втч раскрывает все инклюды). 2) Компилятор компилирует каждый cpp файл по отдельности. в этот момент могут быть некоторые функции/константы/переменные, которые объявлены, но не определены. на выходе получаем объектные файлы. 3) Линкер берёт все объектные файлы и компанует их в один исполняемый/библиотеку/что там ещё?. как правильно подключать хедеры: 1) Если возможно, то в хедере лучше ограничиваться опережающими определениями, а все хедеры подключать в .cpp 2) Это не возможно для: класса предка, классов-членов(не указателей) 3) В "скобки" ifndef/define/endif нужна заключать !всё! тело хедера. Важно чтобы параметр был единственный во всём проекте. что ещё важно понимать: препроцессор в С++ с инклюд работает на редкость тупо(т.е. в KISS-стиле): он просто убирает инклюд и ставит на его место то, что увидел в файле, который ему скормили. и ни каких примудростей в этом нет. Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 20:25 Кстати ещё классический пример "надобности" разделения на .h и .cpp - написание библиотек. Её пользователям предоставляете интерфейс без деталей реализации.
Название: Re: Наследование Отправлено: ruzik от Февраль 11, 2011, 20:29 Расписал, все по cpp и h, и стало всего 2 ошибки, что уже радует))
RizekLineEdit.h Код: #ifndef RIZEKLINEEDIT_H Код: #include "RizekLineEdit.h"; Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 20:40 У меня скомпилилось без проблем, 1 предупреждение правда. Тут
Код в конце точка с запятой лишнее Название: Re: Наследование Отправлено: ruzik от Февраль 11, 2011, 20:43 Нет вы не правы, это как и ; после функции, это лишь стиль программирования, это можно делать а можно и нет, попробуйте поставьте, лично у меня VS никак не реагирует
Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 20:46 Причём здесь "не прав"? Это вобщем-то компилятор мне сказал)) У меня gcc, мелкософтовский компилер презираю и не скрываю этого.
Название: Re: Наследование Отправлено: SimpleSunny от Февраль 11, 2011, 21:04 То что компилируется не означает, что это правильно.
По поводу ; после тела функций можете почитать в этой теме http://www.rsdn.ru/forum/cpp/350584.all.aspx Название: Re: Наследование Отправлено: Fat-Zer от Февраль 11, 2011, 21:05 и ещё для стандартных хедеров приняты угловые скобки: #include <QLineEdit>
Название: Re: Наследование Отправлено: BRE от Февраль 11, 2011, 21:19 и ещё для стандартных хедеров приняты угловые скобки: #include <QLineEdit> Скорее не просто потому что так принято, а из-за разного порядка поиска файлов при использовании "..."|<...>.Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 21:20 и ещё для стандартных хедеров приняты угловые скобки: #include <QLineEdit> насколько знаю, такие использовать принято для "внешних" библиотек. Для своих файлов проекта - " ". Как уже отметил BRE из-за разного поиска.То что компилируется не означает, что это правильно. Никто и не говорит обратного. Но для данного примера и компилятора это правильно.Название: Re: Наследование Отправлено: SimpleSunny от Февраль 11, 2011, 21:34 Никто и не говорит обратного. Как никто, еслиНет вы не правы, это как и ; после функции, это лишь стиль программирования, это можно делать а можно и нет, попробуйте поставьте, лично у меня VS никак не реагирует Но для данного примера и компилятора это правильно. Есть стандарт на С++. При беглом просмотре 16 главы (интересно стало) не нашел упоминания про ;, а только формы:Код
ИМХО лучше не писать код не соответствующий стандарту, если это не критично. Название: Re: Наследование Отправлено: serg_hd от Февраль 11, 2011, 21:56 Никто и не говорит обратного. Как никто, еслиНет вы не правы, это как и ; после функции, это лишь стиль программирования, это можно делать а можно и нет, попробуйте поставьте, лично у меня VS никак не реагирует Название: Re: Наследование Отправлено: ruzik от Февраль 11, 2011, 22:30 Забыл вставить ошибки, которые выдает, вот:
Ошибка 1 error C2084: функция "RizekLineEdit::RizekLineEdit(QWidget *)" уже имеет текст реализации c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.cpp 4 Ошибка 2 error C2084: функция "RizekLineEdit::~RizekLineEdit(void)" уже имеет текст реализации c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.cpp 9 Название: Re: Наследование Отправлено: brankovic от Февраль 11, 2011, 23:51 Забыл вставить ошибки, которые выдает, вот: Ошибка 1 error C2084: функция "RizekLineEdit::RizekLineEdit(QWidget *)" уже имеет текст реализации c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.cpp 4 Ошибка 2 error C2084: функция "RizekLineEdit::~RizekLineEdit(void)" уже имеет текст реализации c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.cpp 9 Посмотрите внимательно, скорее всего у вас реализация методов и в теле класса и в RizekLineEdit.cpp. То что тут пишут про .h и .cpp файлы это опять же только пример стиля программирования. Например, можно вообще всё в одном .cpp написать без заголовков, или полностью библиотеку пометить в .h файл. Название: Re: Наследование Отправлено: ruzik от Февраль 12, 2011, 00:20 brankovic посмотрите чуть выше, я код залил, описание функций только в cpp, а в h только объявление
Название: Re: Наследование Отправлено: brankovic от Февраль 12, 2011, 01:05 brankovic посмотрите чуть выше, я код залил, описание функций только в cpp, а в h только объявление Да, я видел, код правильный. Подумал, что опять для форума что-то сократили неудачно. Вы компилируете из студии, может какой-то глюк, например файл дважды добавлен в проект или кусок класса где-то от копи-пейста остался? Одним словом, я ошибок не вижу (кроме include+; и "" вместо <>). Попробуйте вынести свой же (опубликованный) пример в новый проект и всё должно собраться. Название: Re: Наследование Отправлено: ruzik от Февраль 12, 2011, 11:50 Нет стало только хуже, теперь 34 ошибки, вот они
Ошибка 1 error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "qt_meta_data_RizekLineEdit" c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\GeneratedFiles\Debug\moc_RizekLineEdit.cpp 20 Ошибка 2 error C2377: uint: переопределение; typedef нельзя перегрузить другим символом c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\GeneratedFiles\Debug\moc_RizekLineEdit.cpp 20 Ошибка 3 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\GeneratedFiles\Debug\moc_RizekLineEdit.cpp 20 Ошибка 4 error C2440: инициализация: невозможно преобразовать 'int [15]' в 'const uint *' c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\GeneratedFiles\Debug\moc_RizekLineEdit.cpp 42 Ошибка 5 error C2084: функция "RizekLineEdit::RizekLineEdit(QWidget *)" уже имеет текст реализации c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.cpp 4 Ошибка 6 error C2084: функция "RizekLineEdit::~RizekLineEdit(void)" уже имеет текст реализации c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.cpp 9 Ошибка 7 error C2011: RizekLineEdit: переопределение типа "class" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 3 Ошибка 8 error C2027: использование неопределенного типа "RizekLineEdit" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 11 Ошибка 9 error C2143: синтаксическая ошибка: отсутствие ")" перед "*" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 11 Ошибка 10 error C2143: синтаксическая ошибка: отсутствие ";" перед "*" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 11 Ошибка 11 error C2079: "QWidget" использует неопределенный class "RizekLineEdit" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 11 Ошибка 12 error C2059: синтаксическая ошибка: ) c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 11 Ошибка 13 error C2470: parent: выглядит как определение функции, но без списка параметров; пропускается вероятное тело функции c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 12 Ошибка 14 error C2065: parent: необъявленный идентификатор c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 12 Ошибка 15 error C2027: использование неопределенного типа "RizekLineEdit" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 16 Ошибка 16 error C2059: синтаксическая ошибка: ) c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 16 Ошибка 17 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 17 Ошибка 18 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) c:\documents and settings\rustam\мои документы\visual studio 2008\projects\mybr\mybr\RizekFoundationClasses\RizekLineEdit\RizekLineEdit.h 17 Ошибка 19 error C3867: QObject::parent: в вызове функции отсутствует список аргументов; используйте "&QObject::parent" для создания указателя на член c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 6 Ошибка 20 error C2297: *: недопустимо, правый оператор имеет тип "QObject *(__thiscall QObject::* )(void) const" c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 6 Ошибка 21 error C2275: Qt::WFlags: недопустимое использование этого типа в качестве выражения c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 6 Ошибка 22 error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "flags" c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 6 Ошибка 23 error C2761: {ctor}: повторное объявление функции не разрешается c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 6 Ошибка 24 error C2059: синтаксическая ошибка: ) c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 6 Ошибка 25 error C2143: синтаксическая ошибка: отсутствие ")" перед "," c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 7 Ошибка 26 error C2550: void __cdecl `dynamic initializer for 'parent''(void): список инициализации конструктора должен использоваться только в месте определения конструктора c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 7 Ошибка 27 error C2059: синтаксическая ошибка: ) c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 7 Ошибка 28 error C2550: void __cdecl `dynamic initializer for 'flags''(void): список инициализации конструктора должен использоваться только в месте определения конструктора c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 8 Ошибка 29 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 8 Ошибка 30 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 8 Ошибка 31 error C2027: использование неопределенного типа "RizekLineEdit" c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 66 Ошибка 32 error C2227: выражение слева от "->text" должно указывать на тип класса, структуры или объединения либо на универсальный тип c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 66 Ошибка 33 error C2027: использование неопределенного типа "RizekLineEdit" c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 73 Ошибка 34 error C2227: выражение слева от "->setFixedWidth" должно указывать на тип класса, структуры или объединения либо на универсальный тип c:\Documents and Settings\rustam\Мои документы\Visual Studio 2008\Projects\MyBr\MyBr\mybr.cpp 73 А в основных cpp и h, я подключаю только h, то есть: #include "RizekFoundationClasses/RizekLineEdit/RizekLineEdit.h" P.S. извините что не под спойлером, не нашел кнопку спойлера |