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