Russian Qt Forum

Qt => Базы данных => Тема начата: SABROG от Июнь 14, 2007, 10:36



Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 14, 2007, 10:36
Ух до чего же я ненавижу писать классы с их подводными камнями  :evil:

Никак не получается унаследовать QSqlQuery. Хочу унаследовать так, чтобы переопределить методы exec(const QString &) и exec(), но при этом чтобы передаваемые параметры в конструктор остались такими же как и в QSqlQuery.
---
Сам разобрался.

// sabQuery.h
Код:

class sabQuery : public QSqlQuery
{
public:
        sabQuery ( QSqlResult * result ) : QSqlQuery(result) {};
        sabQuery ( const QString & query = QString(), QSqlDatabase db = QSqlDatabase() ) : QSqlQuery(query, db) {};
        sabQuery ( QSqlDatabase db ) : QSqlQuery(db) {};
        sabQuery ( const QSqlQuery & other ) : QSqlQuery(other) {};
        bool exec( const QString & );
        bool exec();
};


// sabQuery.cpp
Код:

bool sabQuery::exec(const QString &query)
{
        if (!QSqlQuery::exec(query))
        {
        qDebug(qPrintable(lastError().text()));
        return false;
        }
    return true;
}
bool sabQuery::exec()
{
        if (!QSqlQuery::exec())
        {
        qDebug(qPrintable(lastError().text()));
        return false;
        }
    return true;
}


Название: Наследование QSqlQuery
Отправлено: alexis от Июнь 14, 2007, 13:40
а кто тебе сазал, что ты можешь переопределять не виртуальный методы класса?


Название: Наследование QSqlQuery
Отправлено: Steven_Orko от Июнь 14, 2007, 13:49
Цитата: "alexis"
а кто тебе сазал, что ты можешь переопределять не виртуальный методы класса?

А кто сказал, что нет???

Другое дело, что полиморфизмом здесь не пахнет...


Название: Наследование QSqlQuery
Отправлено: Racheengel от Июнь 14, 2007, 14:15
если его объявить как virtual в наследнике, он станет виртуальным.


Название: Наследование QSqlQuery
Отправлено: Sergey B. от Июнь 14, 2007, 14:37
Цитата: "alexis"
а кто тебе сазал, что ты можешь переопределять не виртуальный методы класса?


Код:
class A
{
public:
     . . .
     int foo();
     . . .
};
class B : public A
{
public:
     int foo();
     void bar();
};
void
B::bar()
{
     x = foo();  
    // вызывается метод foo класса B
}

Однако метод базового класса не исчезает. Просто при поиске имени foo сначала просматриваются атрибуты и методы самого класса. Если бы имя не было найдено, начался бы просмотр имен в базовом классе, затем просмотр внешних имен. В данном случае имя foo существует в самом классе, поэтому оно и используется.

С помощью записи A::foo() можно явно указать, что нас интересует имя, определенное в классе A, и тогда запись:

x = A::foo();

вызовет метод базового класса.


Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 14, 2007, 15:38
Рассмотрю любые другие варианты наследования и причины выбора. Классы это больная тема для меня.


Название: Наследование QSqlQuery
Отправлено: Sergey B. от Июнь 14, 2007, 15:51
Цитата: "SABROG"
Рассмотрю любые другие варианты наследования и причины выбора. Классы это больная тема для меня.


Рассматривай :)
http://www.intuit.ru/department/pl/cpp/10/


Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 14, 2007, 18:22
Спасибо за ссылку. У меня есть книга по С++ и даже не одна. Другое дело, что я не могу никак вникнуть. Мне нужны не только примеры как должно быть, но пояснение почему это не может быть иначе на примере. А то читаю например про модификаторы const, static, volatile, register, auto и понимаю, что могу и без них свободно обойтись, т.к. по большей части они нужны, чтобы исключить ошибки программиста...

добавлено спустя 2 часа 4 минуты:

 Есть проблема, если запросов через один QSqlQuery слишком много, то в итоге я получаю:
out of memory Unable to execute statement

пришлось вставить перед exec метод clear. Тогда все нормально. Это баг такой чтоль ?
---
Похоже это не совсем баг, это проблема с SQLITEом, похоже он не хочет выделить памяти под recordset больше чем ему задал разработчик. Вот и приходится теперь после каждого запроса освобождать ресурсы...


Название: Наследование QSqlQuery
Отправлено: Racheengel от Июнь 14, 2007, 19:01
volatile, register, auto и правда нафиг не нужны... это архаизм до-ДОСовских времен.


Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 15, 2007, 11:23
Вот такое объявление увидел в классе, можете объяснить что это такое :) ?

Код:

virtual const char* foo() const = 0;


Название: Наследование QSqlQuery
Отправлено: Вудруф от Июнь 15, 2007, 11:40
volatile необходим для многопоточных программ с общей памятью


Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 15, 2007, 11:46
Тут девушка/тетенька описывает почему volatile бесполезен в многопоточных приложения: http://alenacpp.blogspot.com/2006/04/volatile.html


Название: Наследование QSqlQuery
Отправлено: Steven_Orko от Июнь 15, 2007, 15:48
Цитата: "SABROG"
Тут девушка/тетенька описывает почему volatile бесполезен в многопоточных приложения: http://alenacpp.blogspot.com/2006/04/volatile.html

И там же ниже ей доказывают, что она конкретно неправа...


Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 15, 2007, 16:17
Цитата: "Steven_Orko"
Цитата: "SABROG"
Тут девушка/тетенька описывает почему volatile бесполезен в многопоточных приложения: http://alenacpp.blogspot.com/2006/04/volatile.html

И там же ниже ей доказывают, что она конкретно неправа...


А она на это пишет, что ни одного реального примера ей так никто и не предоставил, только теория...


Название: Наследование QSqlQuery
Отправлено: Steven_Orko от Июнь 15, 2007, 17:04
Цитата: "SABROG"
Цитата: "Steven_Orko"
Цитата: "SABROG"
Тут девушка/тетенька описывает почему volatile бесполезен в многопоточных приложения: http://alenacpp.blogspot.com/2006/04/volatile.html

И там же ниже ей доказывают, что она конкретно неправа...


А она на это пишет, что ни одного реального примера ей так никто и не предоставил, только теория...

Ну, дык и она все в теории... Хотя там и про драйвера ей писали, и про прерывания, и про сигналы... Помоему "девочке шапка на по размеру", ИМХО.


Название: Наследование QSqlQuery
Отправлено: Insomniac от Июнь 15, 2007, 17:15
Цитата: "SABROG"
Вот такое объявление увидел в классе, можете объяснить что это такое :) ?

Код:

virtual const char* foo() const = 0;

Предполагаю, что это чисто виртуальная константная функция-член, возвращающая указатель на константу типа(ну, типа-а-а, имеющую тип) char.
О том, что она чисто виртуальная функция говорит = 0. Класс, имеющий хотя бы одну такую функцию, называется абстрактным. Экземпляр такого класса создать нельзя.
Const после foo() говорит о том, что функция-член - константная. Это означает что она может проверять состояние объекта, но не может вносить изменения. Если внутри такой функции-члена ты захочешь изменить значение какой-нибудь переменной-члена, то компилятор покажет тебе фигушку.
Собственно все.


Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 15, 2007, 18:37
Сложная функцию. Т.е. я не могу создать экземпляр например так ?:

Код:

MyClass vasya;


Но могу использовать ее так ?:

Код:

vasya::foo();


Неужели есть такие программисты, которые настолько параноидально огораживают свои классы барьером различных условий, дабы компилятор выдал им ошибку, типа: "забылся Василий!".


Название: Наследование QSqlQuery
Отправлено: Insomniac от Июнь 15, 2007, 19:12
Я полагаю, что ты должен создать наследника от этого абстрактного класса, в котором определишь эту функцию.
Пример.
    Ты - Бог и решил заселить мир жЫвотными. Ты решаешь, что каждое жЫвотное может жрать, спать и срать, и создаешь общий для всех класс "жЫвотное".
    НО! Каждое создание божье это делает по своему. С другой стороны если ты создашь экземпляр такого "жЫвотного", которое жрет, спит и все остальное делает неизвесно как, то это будет фильм ужасов, а не заселенный мир. Поэтому ты, о мудрый создатель, обзываешь все эти методы чисто виртуальными.
   Теперь ты создаешь новые классы "мышь" и "кошь", наследуя их от "жЫвотного", и у них определяешь эти методы - для каждого по-своему.
Короче, если я правильно понял, то абстрактные классы - это путь к полиморфизму.


Название: Наследование QSqlQuery
Отправлено: SABROG от Июнь 15, 2007, 21:16
А зачем мне нужны вообще эти виртуальные методы, которые надо переопределять, если кто-то другой сам может ввести новые методы на "посрать", "поспать" и еще чего-нибудь. А то глядишь "кошь" родится с генетическими отклонениями и не сможет "посрать" и через какое-то время умрет от интоксикации, к примеру.


Название: Наследование QSqlQuery
Отправлено: Insomniac от Июнь 15, 2007, 21:55
Цитата: "SABROG"

...
 А то глядишь "кошь" родится с генетическими отклонениями и не сможет "посрать" и через какое-то время умрет от интоксикации, к примеру.

Естественный отбор  :).
А вообще С++, как и Россию - умом не понять. Он слишком объемен, чтобы прочитать книгу и сказать:"О! мне все ясно! Пойду спать."
У меня несколько книг, бумажных и электронных, и я периодически их читаю и пытаюсь понять.
Проблема в том, что приведенные в книгах примеры предназначены только для демонстрации техники программирования, поэтому смотря на них думаешь: "Какого... такую простую вещь делать с таким сложностями". Все эти заморочки проявляют себя в больших проектах. И есть примеры, как надо и как не надо программировать на С++ с использованием объектного программирования.
Пример, как надо использовать С++ - догадайся с первого раза.
Правильно - Qt.
Как не надо - MFC.
Предупреждаю сразу - это ИМХО 8) , а не призыв к Халивару, поэтому спорить на тему, кто из них лучше, категорически не буду.