Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ZicoRio от Январь 14, 2012, 13:04



Название: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: 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 *


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: andrew.k от Январь 14, 2012, 13:33
уж сколько раз твердили миру, что изучение qt нужно начинать с изучения c++, а не наоборот.
qt-шные классы принято передавать по константной ссылке.
что-то не так делаешь, раз даже не компилится.


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: ZicoRio от Январь 14, 2012, 13:43
Полностью с вами согласен.
Купил книжулю - уже читаю.
Но прошу не ругать меня а конкретно ответить на мой вопрос (если можно односложно).
Когда нужно объявлять свойства со звездочкой (*), а когда без?
К примеру:
QString var1="tratata";
или
QString *var1=new QString("tratata");


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: kambala от Январь 14, 2012, 14:16
кратко: звёздочка означает указатель. переменные, объявленные без звёздочки, автоматически уничтожаются при выходе из области видимости (почитаешь в книжке что это такое и как её определять), а объявленные со звёздочкой надо уничтожать самому оператором delete (если конечно ты выделял под них память оператором new).

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


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: ZicoRio от Январь 14, 2012, 14:23
Спасибо за человеческий ответ, но в том-то и дело, что для Qt это не совсем так.
В книжке про Qt (Шлее) сказано, что вроде как все нужно объявлять динамически (как я понял это тождественно - со звездочкой). Что Qt сам позаботиться о памяти в этом случае...
Поэтому и возник у меня такой на первый взгляд простой вопрос применительно к Qt!
Хотелось бы услышать комментарий гуру по Qt...


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: kambala от Январь 14, 2012, 14:28
если при создании какого-либо Qt-объекта (наследника QObject) ты указываешь ему родителя (в конструкторе всегда есть параметр parent), тогда да, руками удалять память не нужно. так обычно делают с виджетами. но всякие строки, массивы и т.п. обычно объявляют без звёздочки.


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: ZicoRio от Январь 14, 2012, 14:42
ага, тогда такой вопрос:
почему при компиляции (изначально я создавал QStringList без звезды)
при передаче в сигнале QStringList выдается сообщение, что нету в нем свойства .size() - которое я далее использую?


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: lit-uriy от Январь 14, 2012, 14:48
ZicoRio забудь про слово "свойство", в Си++ нет такого понятия. Есть переменные.


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: mutineer от Январь 14, 2012, 15:45
Спасибо за человеческий ответ, но в том-то и дело, что для Qt это не совсем так.

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


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: Igors от Январь 14, 2012, 16:28
Полезно потренироваться с ** (двумя звездочками), тогда "просто *" станет ясной. Напр на такой задачке

- дан массив целых чисел, удалить повторяющиеся элементы не меняя порядка следования оставшихся. Массив большой, "просто перебор" нельзя. Контейнеров ++/Qt нет, есть только ф-ция qsort (stdlib.h)


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: ZicoRio от Январь 14, 2012, 17:01
По поводу [Выучи сначала] - уже учу.
Чтобы потренироваться с ** (двумя звездочками) надо знать что это такое.
А я только начал читать С++.
Но логика-то у задачки понятна.

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


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: mutineer от Январь 14, 2012, 17:25
Писать на плюсах без знания об указателях очень сложно и опасно


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: andrew.k от Январь 14, 2012, 22:57
если ты себе не враг и хочешь добиться четких знаний, отложи qt на пару месяцев хотя бы и плотно займись с++.
поделай задачки такого плана как игорс сказал.
а то потом будешь как чечино на этом форуме "пишу как хочу черти что, лишь бы работало".
а сейчас ответы на твои вопросы - это медвежья услуга.


Название: Re: Когда нужно объявлять свойства со звездочкой (*), а когда без
Отправлено: ZicoRio от Январь 15, 2012, 11:12
Учу-учу уже (стараюсь взять себя в руки и не бежать).
Вообще немного непривычно после веб технологий (много лет) - о какой-то памяти надо думать :))
переменные только одного типа и т.д...
Хочу сделать гибрид этих технологий - потому как у каждой свои плюсы.

Ну раз уж разговор пошел - вот еще вопрос:
решил вживить статически драйвер MySql в Qt (лучше бы не делал).
Все сделал по оф.доке но перекомпиляция Qt завершилась с ошибкой (памяти на что-то не хватило).
И после этого WebKit в приложении начал глючить - неверно отрисовывать элементы на странице и ловить ошибки там где их нет (Ajax).
Может ли это быть связано и что делать теперь (переустановка Qt не помогает)?