Просмотр сообщений
|
Страниц: [1]
|
1
|
Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами.
|
: Август 27, 2023, 10:15
|
я ж уже писал как из varargs сделать QString: и тогда нужен будет лишь один конструктор с QString То же самое предупреждение появляется. Нет никакой разницы. В общем, я просто продублировал этот конструктор в каждом типе исключения, раз иначе никак.
|
|
|
2
|
Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами.
|
: Август 23, 2023, 08:05
|
нет никакой разницы ОК, я понял, что можно только сишные строки. Так и ладно, нет проблем. Вопрос остается: Как мне сделать так, чтобы можно было выбрасывать исключение, например, так: const char S_ERRORSTR[] = "error string"; const char S_FMTERR[] = "%s %.3f %.3f"; ... throw MyException(S_ERRORSTR); ... throw MyException(S_FMTERR, x, y);
См. выше. Конструкторы так объявить не дает. Если сделать статик функцией, то непонятно, как генерировать именно тот тип исключения для которого оно выбрасывается. В каждом потомке базового класса тупо дублировать такую статик-функцию? А если так: class Exception : public QException { protected: String f_message; public: Exception(const char fmt[], const void *[]) { .............. } Чтобы можно было засовывать массив переменных и делать из них строку по формату. Можно как-то так сделать?
|
|
|
4
|
Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами.
|
: Август 21, 2023, 10:49
|
вызывает предупреждение "non-POD static (QString) [clazy-non-pod-global-static]" это статическое поле в классе? «на месте» можно инициализировать лишь встроенные типы, остальные надо вне объявления класса. для константных строк есть способ получше через QStringLiteral. Нет, конечно. Просто в .h файле так и пишу. Глобальное объявление, то есть. А пример с QStringLiteral можно? А то я как-то не нашел. что такое QMessage? Опечатка. Конечно же QException. Так см. п. 1 - как объявить сообщения об ошибках? Если их можно объявлять только через сишные строки - константы, то откуда брать QString?
|
|
|
5
|
Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами.
|
: Август 19, 2023, 15:27
|
Еще непонятно, как сделать два конструктора вот такие: public: Exception(const char msg[]) { f_message = String::fromUtf8(msg); } Exception(const char *cformat, ...) { .... }
Так оно ругается на дублирование (ясное дело). А если последний сделать не конструктором, а static функцией, возвращающей Exception, то тогда получается, что ее придется дублировать во всех потомках. Как-то смысл теряется. Я же хочу возвращать тот класс, для которого вызываю, а не базовый. Можно это как-то красиво решить?
|
|
|
6
|
Qt / Вопросы новичков / Re: Как написать функцию Length(QList *)?
|
: Август 19, 2023, 04:26
|
вызовется конструктор по умолчанию в обоих случаях
Простите мне мою необразованность, но что является конструктором для структуры? У меня там везде элементами массива (который QList) являются не классы, а структуры. Или это сейчас уже не важно с точки зрения компилятора? С тех пор, как у структур появились методы, все смешалось...
|
|
|
7
|
Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами.
|
: Август 19, 2023, 04:04
|
да, ты все верно понял. но можно и немного по-другому делать: - добавить / заменить на конструктор, принимающий QString, тогда не придется туда-сюда гонять сишную строку
Ха! так и было задумано сначала. Но я не понял, как мне объявить все эти строки для сообщений об ошибках. Простое объявление типа const QString S_ERR_CONFIGISMISSING = "Не задана конфигурация"; вызывает предупреждение " non-POD static (QString) [clazy-non-pod-global-static]", что бы это ни значило. Я прочитал, что это связано с инициализацией памяти в DLL, что как раз мой случай (это все в DLL). Поэтому я бы и рад, но не нашел способа. Хотя, я согласен, что для clone() можно завести отдельный конструктор с QString. Об этом я просто не подумал. - если нет цели использовать это исключения с QtConcurrent (QException задуман именно для него, как я понял), можно унаследоваться от std::exception или вообще создать свой базовый класс исключений
Есть цель использовать это внутри потоков. Я прочитал, что QMessage для этого подходит лучше. Это так? А так-то да, вообще свой класс объявить и его и выбрасывать и ловить. Мне просто нужны типы исключений с доп. параметрами. Не только строчка сообщения, но и несколько значений типа double, например.
|
|
|
8
|
Qt / Вопросы новичков / Свой класс исключения с доп. параметрами.
|
: Август 18, 2023, 18:51
|
Всем здравствуйте! Что-то в доке не особо много написано. Хочется чего-то такого: class myException : public QException { myException(const char msg[]) {f_msg = QString::fromUtf8(msg);} public: QString message(); void raise() const override { throw *this; } Exception *clone() const override { return new MyException(*this); } private: QString f_msg; };
Выбрасывать примерно так: throw myException("some text");
И обрабатывать как-то так: try { ........... } catch (myException e) { QMessageBox::critical(&w, "Ошибка", e.message()); return 1; } }
Так пойдет? Непонятно, что писать в clone() { return new myException(this.message().toUTF8()); }
Или как? -Спасибо
|
|
|
9
|
Qt / Вопросы новичков / Re: Как написать функцию Length(QList *)?
|
: Август 18, 2023, 18:05
|
OK, принято. Там еще не очень понятно с оператором []. Допустим, элементом листа является некая структура. Когда делается resize(), эти элементы заполняются нулями? Или там просто кусок памяти с мусором в каждом элементе? И допустим также. что одно из полей структуры тоже QList<T>. Это поле никак не надо предварительно инициализировать? Его сразу можно использовать, например тоже ему делать resize()?
|
|
|
10
|
Qt / Вопросы новичков / Re: Как написать функцию Length(QList *)?
|
: Август 18, 2023, 04:35
|
Спасибо! И то есть, получается, что при такой записи без разницы, что передавать в аргумент - экземпляр класса или указатель на него? То есть, если передать (QList *myArray), то оно преобразуется в myArray->size() ?
|
|
|
11
|
Qt / Вопросы новичков / Как написать функцию Length(QList *)?
|
: Август 17, 2023, 17:13
|
Доброго времени суток! Возник вопрос: как написать функцию, возвращающую QList::count(), но именно, как функцию с аргументом (QList *)? Я перевожу большой проект с Delphi на Qt. и первое (ну, почти ), с чем столкнулся, это как бы так записать Length() и SetLength(), если я в качестве массивов использую QList? Хотелось бы именно универсальные функции, а не для каждого класса свою пару, так-то смысл теряется почти - можно простой заменой пройтись и везде заменить Length(myArray) на myArray.count()... Есть более красивое решение? -Спасибо.
|
|
|
|
|