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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Когда нужно объявлять свойства со звездочкой (*), а когда без  (Прочитано 7027 раз)
ZicoRio
Гость
« : Январь 14, 2012, 13:04 »

Всем добрый день.
Начал изучать Qt.
Решил смастерить для пробы браузер. С сигналами и слотами разобрался.
Но не пойму когда нужно объявлять свойства со звездочкой (*), а когда без?
К примеру:
QStringList var1;
QStringList *var1;
Пишу: QObject::connect(req,SIGNAL(daSend(int,QString*,QStringList*,QStringList*)),this,SLOT(preView(int,QString*,QStringList*,QStringList*)));
Слот объявлен: void preView(int tat,QString *A2,QStringList *B2,QStringList *C2);
При компиляции говорит, что B2 не соответствует типу QStringList *
Записан
andrew.k
Гость
« Ответ #1 : Январь 14, 2012, 13:33 »

уж сколько раз твердили миру, что изучение qt нужно начинать с изучения c++, а не наоборот.
qt-шные классы принято передавать по константной ссылке.
что-то не так делаешь, раз даже не компилится.
Записан
ZicoRio
Гость
« Ответ #2 : Январь 14, 2012, 13:43 »

Полностью с вами согласен.
Купил книжулю - уже читаю.
Но прошу не ругать меня а конкретно ответить на мой вопрос (если можно односложно).
Когда нужно объявлять свойства со звездочкой (*), а когда без?
К примеру:
QString var1="tratata";
или
QString *var1=new QString("tratata");
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Январь 14, 2012, 14:16 »

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

указатели - одно из самых основных понятий в С и С++, с ними надо разобраться очень хорошо.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ZicoRio
Гость
« Ответ #4 : Январь 14, 2012, 14:23 »

Спасибо за человеческий ответ, но в том-то и дело, что для Qt это не совсем так.
В книжке про Qt (Шлее) сказано, что вроде как все нужно объявлять динамически (как я понял это тождественно - со звездочкой). Что Qt сам позаботиться о памяти в этом случае...
Поэтому и возник у меня такой на первый взгляд простой вопрос применительно к Qt!
Хотелось бы услышать комментарий гуру по Qt...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #5 : Январь 14, 2012, 14:28 »

если при создании какого-либо Qt-объекта (наследника QObject) ты указываешь ему родителя (в конструкторе всегда есть параметр parent), тогда да, руками удалять память не нужно. так обычно делают с виджетами. но всякие строки, массивы и т.п. обычно объявляют без звёздочки.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ZicoRio
Гость
« Ответ #6 : Январь 14, 2012, 14:42 »

ага, тогда такой вопрос:
почему при компиляции (изначально я создавал QStringList без звезды)
при передаче в сигнале QStringList выдается сообщение, что нету в нем свойства .size() - которое я далее использую?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Январь 14, 2012, 14:48 »

ZicoRio забудь про слово "свойство", в Си++ нет такого понятия. Есть переменные.
Записан

Юра.
mutineer
Гость
« Ответ #8 : Январь 14, 2012, 15:45 »

Спасибо за человеческий ответ, но в том-то и дело, что для Qt это не совсем так.

Выучи сначала плюсы хотя бы на базовом уровне. А то потом будет каша в голове и непонимание происходящего. Qt позаботится об удалении только если у созданного класса будет родитель. Ну и если самого верхнего родителя в цепочке кто-нить удалит
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 14, 2012, 16:28 »

Полезно потренироваться с ** (двумя звездочками), тогда "просто *" станет ясной. Напр на такой задачке

- дан массив целых чисел, удалить повторяющиеся элементы не меняя порядка следования оставшихся. Массив большой, "просто перебор" нельзя. Контейнеров ++/Qt нет, есть только ф-ция qsort (stdlib.h)
Записан
ZicoRio
Гость
« Ответ #10 : Январь 14, 2012, 17:01 »

По поводу [Выучи сначала] - уже учу.
Чтобы потренироваться с ** (двумя звездочками) надо знать что это такое.
А я только начал читать С++.
Но логика-то у задачки понятна.

Понятно, что я сейчас голопом по европам скачу.
Просто очень нужно было сделать подключалку к нескольким DB.
Пришлось сделать (работает), а потом разбираться в тонкостях (разные там потоки наладить).
« Последнее редактирование: Январь 14, 2012, 17:03 от ZicoRio » Записан
mutineer
Гость
« Ответ #11 : Январь 14, 2012, 17:25 »

Писать на плюсах без знания об указателях очень сложно и опасно
Записан
andrew.k
Гость
« Ответ #12 : Январь 14, 2012, 22:57 »

если ты себе не враг и хочешь добиться четких знаний, отложи qt на пару месяцев хотя бы и плотно займись с++.
поделай задачки такого плана как игорс сказал.
а то потом будешь как чечино на этом форуме "пишу как хочу черти что, лишь бы работало".
а сейчас ответы на твои вопросы - это медвежья услуга.
« Последнее редактирование: Январь 14, 2012, 23:00 от andrew.k » Записан
ZicoRio
Гость
« Ответ #13 : Январь 15, 2012, 11:12 »

Учу-учу уже (стараюсь взять себя в руки и не бежать).
Вообще немного непривычно после веб технологий (много лет) - о какой-то памяти надо думать Улыбающийся)
переменные только одного типа и т.д...
Хочу сделать гибрид этих технологий - потому как у каждой свои плюсы.

Ну раз уж разговор пошел - вот еще вопрос:
решил вживить статически драйвер MySql в Qt (лучше бы не делал).
Все сделал по оф.доке но перекомпиляция Qt завершилась с ошибкой (памяти на что-то не хватило).
И после этого WebKit в приложении начал глючить - неверно отрисовывать элементы на странице и ловить ошибки там где их нет (Ajax).
Может ли это быть связано и что делать теперь (переустановка Qt не помогает)?
« Последнее редактирование: Январь 15, 2012, 11:27 от ZicoRio » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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