Russian Qt Forum
Апрель 24, 2024, 23:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Наследование  (Прочитано 29626 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Февраль 11, 2011, 18:30 »

Цитировать
Я имею ввиду чем по-вашему плох способ:
Плох тем, что в Qt нет QWidget::addWidget()  Улыбающийся
А вот QLayout::addWidget() есть.
Но, бывают случаи, когда лейаута может и не быть.
С остальном способ не плох, но мне, имхо, не нравится.
Записан

Qt 5.11/4.8.7 (X11/Win)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #16 : Февраль 11, 2011, 18:32 »

конечно я имел ввиду лайауты
Записан

kubuntu/Win7/x64/NetBeans
ruzik
Гость
« Ответ #17 : Февраль 11, 2011, 18:33 »

А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #18 : Февраль 11, 2011, 18:39 »

Цитировать
А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту
Дело в том, что инлкюды обычно меняются не так часто, как сами исходники.
И если этот класс используется во многих исходниках, то при каждом изменении этого инклюда, будут перекомпиляться эти исходники.
Ну и считается, что имплиментацию лучше спрятать от других.
Записан

Qt 5.11/4.8.7 (X11/Win)
Fat-Zer
Гость
« Ответ #19 : Февраль 11, 2011, 18:43 »

А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту
потому что тогда определения попадут во все cpp файлы в которые включается этот хедер и будет 28 ошибок.
Если не хотите реализацию писать в отдельном файле, то нужно сделать их встроинными:
Код
C++ (Qt)
#include <QLineEdit>
 
class RLineEdit: public QLineEdit
{
       Q_OBJECT
 
public:
       RLineEdit(QWidget *parent = 0);
       { this->setStyleSheet("QLineEdit { border-radius: 5px; padding: 2px 2px; border: 1px groove gray;}"); };
       ~RLineEdit(){};
};
 
не люблю себя цитировать, но:
И хорошо бы увидеть полный список ошибок под каким-нить спойлеров.
« Последнее редактирование: Февраль 11, 2011, 18:46 от Fat-Zer » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #20 : Февраль 11, 2011, 18:45 »

Цитировать
А зачем расписывать функции класса в отдельном cpp файле, я хочу все расписать в заголовочном и просто его подключить, к основному проекту
Дело в том, что инлкюды обычно меняются не так часто, как сами исходники.
Угу, поэтому и рекомендуется в .h-файлах прописывать:
Код
C++ (Qt)
class MyClass;
 

вместо:
Код
C++ (Qt)
#include <MyClass.h> //это будет в .cpp
 

иначе изменение MyClass повлекло бы за собой перекомпил класса, который относится к .h
« Последнее редактирование: Февраль 11, 2011, 18:50 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #21 : Февраль 11, 2011, 18:50 »

Цитировать
Интересует именно: как при этом можно будет создать объект без передачи предка. Т.к. я привык к:
Вы чего-то недогоняете( Посмотрите первое сообщение. Там есть описание конструктора с дефолтным предком. Что непенятно-то? Шокированный

Цитировать
Поэтому и рекомендуется в .h-файлах прописывать:
Ну и? Про это разве кто-то спрашивал?
« Последнее редактирование: Февраль 11, 2011, 18:54 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #22 : Февраль 11, 2011, 18:51 »

Цитировать
Поэтому и рекомендуется в .h-файлах прописывать:
Ну и? Про это разве кто-то спрашивал?
Нет, это просто совет ruzik'у. А я разве где-то что-то опроверг?
Записан

kubuntu/Win7/x64/NetBeans
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #23 : Февраль 11, 2011, 18:56 »

Цитировать
А я разве где-то что-то опроверг?
Нет, просто это было подано как-то странно.
Записан

Qt 5.11/4.8.7 (X11/Win)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #24 : Февраль 11, 2011, 19:12 »

Насчёт
Код
C++ (Qt)
RLineEdit::RLineEdit(QWidget *parent )
: QLineEdit( parent )
{
   ...
}
вобщем-то эта инициализация методов и должна была лежать в .cpp, сбило с толку). Я почему-то принял этот код за декларацию. Наверное из-за непривычки что в одном файле и (!)раздельно. Обычно если класс полностью в .h, так хоть не разделяют, ппц
« Последнее редактирование: Февраль 11, 2011, 19:16 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
ruzik
Гость
« Ответ #25 : Февраль 11, 2011, 19:43 »

А не подскажите как правильно расписать все подключения и тп в cpp и h файлах, и вообще это надо, я говорю про всякие
#ifndef RLINEEDIT_H
#define RLINEEDIT_H
.....
#endif
В h файле
И вообще как компилятор определяет cpp файл, со всеми описаниями если он нигде не подключается(во всяком случае в виде inclide)
Записан
Fat-Zer
Гость
« Ответ #26 : Февраль 11, 2011, 19:56 »

порядок компиляции вкратце:
0) компилятор ничего не знает о хедарах
1) препроцессор вместо всех директив подставляет то что должен (втч раскрывает все инклюды).
2) Компилятор компилирует каждый cpp файл по отдельности. в этот момент могут быть некоторые функции/константы/переменные, которые объявлены, но не определены. на выходе получаем объектные файлы.
3) Линкер берёт все объектные файлы и компанует их в один исполняемый/библиотеку/что там ещё?.

как правильно подключать хедеры:
1) Если возможно, то в хедере лучше ограничиваться опережающими определениями, а все хедеры подключать в .cpp
2) Это не возможно для: класса предка, классов-членов(не указателей)
3) В "скобки" ifndef/define/endif нужна заключать !всё! тело хедера. Важно чтобы параметр был единственный во всём проекте.

что ещё важно понимать:
препроцессор в С++ с инклюд работает на редкость тупо(т.е. в KISS-стиле): он просто убирает инклюд и ставит на его место то, что увидел в файле, который ему скормили. и ни каких примудростей в этом нет.
« Последнее редактирование: Февраль 11, 2011, 20:05 от Fat-Zer » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #27 : Февраль 11, 2011, 20:25 »

Кстати ещё классический пример "надобности" разделения на .h и .cpp - написание библиотек. Её пользователям предоставляете интерфейс без деталей реализации.
Записан

kubuntu/Win7/x64/NetBeans
ruzik
Гость
« Ответ #28 : Февраль 11, 2011, 20:29 »

Расписал, все по cpp и h, и стало всего 2 ошибки, что уже радует))
RizekLineEdit.h
Код:
#ifndef RIZEKLINEEDIT_H
#define RIZEKLINEEDIT_H

#include "QLineEdit"

class RizekLineEdit: public QLineEdit
{
Q_OBJECT

public:
RizekLineEdit(QWidget *parent = 0);
~RizekLineEdit();
};

#endif
RizekLineEdit.cpp
Код:
#include "RizekLineEdit.h";

RizekLineEdit::RizekLineEdit(QWidget *parent )
:QLineEdit(parent)
{
this->setStyleSheet("QLineEdit { border-radius: 5px; padding: 2px 2px; border: 1px groove gray;}");
}
RizekLineEdit::~RizekLineEdit()
{

}
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #29 : Февраль 11, 2011, 20:40 »

У меня скомпилилось без проблем, 1 предупреждение правда. Тут
Код
C++ (Qt)
#include "RizekLineEdit.h";
 
в конце точка с запятой лишнее
Записан

kubuntu/Win7/x64/NetBeans
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.403 секунд. Запросов: 22.