Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2011, 11:27   #1
ИВэТэшка
Пользователь
 
Аватар для ИВэТэшка
 
Регистрация: 01.02.2009
Сообщений: 52
По умолчанию Отличие в создании объектов классов в QT Creator

Добрый день! Совсем недавно начала изучать программирование в QT.
Возник вопрос, который наверное больше связан с ООП в С++ чем непосредственно с QT.
В чем различие в создании объектов класса:
1 вариант:
Код:
QPushButton *btn = new QPushButton;
2 вариант:
Код:
QPushButton btn;
и соответственно их использование...
для 1 варианта:
Код:
btn->show();
для 2 варианта:
Код:
btn.show();
В литературе не смог найти. В одних примерах объекты создаются одним образом, в других другим.
И еще есть ли книги по программированию в QT кроме М.Шлее "QT4 Профессиональное программирование на С++" и его же книга по QT4.5 (вторая, там еще более тяжело написано, по крайней мере для меня )

Спасибо.
Машины должны работать! Люди должны думать!
ИВэТэшка вне форума Ответить с цитированием
Старый 13.06.2011, 11:48   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

первое это создание объекта в куче, при потери ссылки/указателя на него память зависнет(утечка)
обращатся можно как вы показали, а можно (*btn).show();
второе это создание объекта на стеке, при выходе из функции память будет гарантирована освобождена.
но в тоже время переменная существует только внутри функции, указатель на нее, наружу передавать нельзя(можно, но не стоит), внутрь по вызову функций можно в принципе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.06.2011, 14:37   #3
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от ИВэТэшка Посмотреть сообщение
Добрый день! Совсем недавно начала изучать программирование в QT. ...
И еще есть ли книги по программированию в QT кроме М.Шлее "QT4 Профессиональное программирование на С++" и его же книга по QT4.5 (вторая, там еще более тяжело написано, по крайней мере для меня )

Спасибо.
Есть ещё Жасмин Бланшет "Программирование GUI на C++". Но, можно вопрос: Что Вам там непонятно именно? Задайте 3-и вопроса, хотя-бы. Просто для статистики

Может мне, после обзорного знакомства с программированием на чистом WinAPI, эта книга показалась относительно несложной

По-моему проще будет создать видеокурс Qt-программинг для 8-ого класса?! Прошу прощения, за такой ИМХО
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 13.06.2011, 15:23   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Создавать в стеке можно только виджеты верхнего уровня, т.е. те, у которых нет предков. Это связано с тем, что в Qt объекты-предки берут на себя освобождение памяти, выделенной под объекты-потомки и это освобождает нас от необходимости вызывать delete для объектов, созданных с помощью new. С другой стороны, если мы создадим виджет в стеке и сделаем его потомком некоторого другого виджета, то удален он будет два раза: в деструкторе объекта-предка и при выходе из области видимости, что приведет к ошибке.
Поэтому все виджеты, кроме виджетов верхнего уровня, должны быть созданы в куче вызовом оператора new. Как создавать виджеты верхнего уровня - решайте сами, но, по-моему, лучше создавать их в стеке.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.06.2011, 12:49   #5
ИВэТэшка
Пользователь
 
Аватар для ИВэТэшка
 
Регистрация: 01.02.2009
Сообщений: 52
По умолчанию

Спасибо за ответы!

Цитата:
Может мне, после обзорного знакомства с программированием на чистом WinAPI
можно с этого места поподробнее что до этого изучали, в чем программировали?
Машины должны работать! Люди должны думать!
ИВэТэшка вне форума Ответить с цитированием
Старый 14.06.2011, 13:55   #6
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от ИВэТэшка Посмотреть сообщение
... можно с этого места поподробнее что до этого изучали, в чем программировали?
QBasic, TurboPascal, Delphi, C, C++(Qt). Указано в правильной последовательности.

Я давно видел Visual Studio - там я не нашёл дизайнера форм, поэтому продолжал изучать Delphi. В Delphi я пробовал писать программы на чистом WinAPI - было тяжело(без дизайнера) - но нужный опыт я получил. Потом, после WinAPI я, открыв книгу Шлее(Qt4) - вспомнил, как я это делал без дизайнера и переключался недолго. Разобравшись с дизайнером - я вообще потерял видимую грань, разделявшую Delphi и Qt. Увидел только преимущество в Qt над Delphi(сигналы и слоты).

А у Шлее(Qt4.5) - вообще описан QtCreator(!) - сам Столлман велел брать и писать программы.

ЗЫ: замечу, что я один не могу оценить свой уровень в написании программ(дать объективную оценку). Это дело общественности, поэтому всё, что я говорю, считаю уровнем познания новичка. Думаю ответил
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 14.06.2011, 20:16   #7
iukash
учу английский...
Форумчанин
 
Аватар для iukash
 
Регистрация: 04.04.2009
Сообщений: 480
По умолчанию

Цитата:
в Qt объекты-предки берут на себя освобождение памяти, выделенной под объекты-потомки и это освобождает нас от необходимости вызывать delete для объектов, созданных с помощью new
В принципе все верно, но если в классе создаешь указатель на другой класс с помощью new, не потомок первого, то его необходимо удалить в деструкторе первого класса через delete.
Пример
.h
Цитата:
class TableModel;
class Table2 : public QDialog
{
public:
explicit Table2(QWidget *parent = 0);
~Table2();

private:
TableModel *tablemodel;
};
.cpp
Цитата:
Table2::Table2(QWidget *parent) :
QDialog(parent)
{
tablemodel = new TableModel();
}

Table2::~Table2()
{
delete tablemodel;
}
"Мы можем что-то изменить и своими силами..."
"Начнешь с себя, примером ближнему поможешь..."
iukash вне форума Ответить с цитированием
Старый 15.06.2011, 20:44   #8
ИВэТэшка
Пользователь
 
Аватар для ИВэТэшка
 
Регистрация: 01.02.2009
Сообщений: 52
По умолчанию

xwicked, спасибо за такой полный ответ

У меня изучение было примернов в следующем порядке:
Turbo Pascal, C/C++, Delphi (ну и еще параллельно всякие языки, наподобие GPSS, Prolog, G, PHP и т.д.) но изучал не глубоко, наверное поэтому здесь возникли трудности. Разберусь постепенно

Нашел по QT интересные уроки на сайте http://doc.crossplatform.ru/
Машины должны работать! Люди должны думать!
ИВэТэшка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qt creator 2.0.1 Hemul Qt и кроссплатформенное программирование С/С++ 12 26.02.2011 17:48
Проблема с созданием двумерного массива из объектов производных классов Vang Общие вопросы C/C++ 15 28.05.2010 17:04
Чтение/запись объектов классов из/в бинарные файлы Гром Общие вопросы C/C++ 9 18.05.2010 22:20
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18