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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами. : Август 27, 2023, 10:15
я ж уже писал как из varargs сделать QString:
можно заранее QString сформировать, например, через https://doc.qt.io/qt-5/qstring.html#asprintf
и тогда нужен будет лишь один конструктор с 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 *[]) { .............. }
Чтобы можно было засовывать массив переменных и делать из них строку по формату.
Можно как-то так сделать?
3  Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами. : Август 21, 2023, 11:13
То есть буквально вот мой .h файл:
Код:
#ifndef RC_STRINGS_H
#define RC_STRINGS_H
#include <QString>

static const QString testString = "Test string";
И вот в этой строке появляется предупреждение:
Код:
ххххх\rc_strings.h:5:1: non-POD static (QString) [clazy-non-pod-global-static]
С вот такой ссылкой на документацию:
https://github.com/KDE/clazy/blob/1.11/docs/checks/README-non-pod-global-static.md
которая мало что для меня проясняет. Я так понял, что в DLL так строки инициализировать нельзя.
4  Qt / Вопросы новичков / Re: Свой класс исключения с доп. параметрами. : Август 21, 2023, 10:49
Цитировать
вызывает предупреждение "non-POD static (QString) [clazy-non-pod-global-static]"
это статическое поле в классе? «на месте» можно инициализировать лишь встроенные типы, остальные надо вне объявления класса. для константных строк есть способ получше через QStringLiteral.
Нет, конечно. Просто в .h файле так и пишу. Глобальное объявление, то есть.
А пример с QStringLiteral можно? А то я как-то не нашел.
что такое QMessage?
Опечатка. Конечно же QException.
а без varargs никак? Улыбающийся можно заранее QString сформировать, например, через https://doc.qt.io/qt-5/qstring.html#asprintf
Так см. п. 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()... Есть более красивое решение?

-Спасибо.
Страниц: [1]

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