LINUX.ORG.RU

Класс для работы с базой самопроизвольно удаляется

 ,


0

1

Доброго времени суток, собственно такая ситуация: создал класс для работы с MySQL с двумя приватными полями :

QSqlDatabse workDB;

QSqlQuery * query;

Инициализирую их в конструкторе, все проходит нормально, workDB.open() возвращает true, создается новый объект QSqlQuery, после чего, почему-то сразу же вызывается деструктор, хотя объект после этого ещё используется, а деструктор никто не вызывал. Если закомментировать деструктор, то соединения просто тихо закрываются.

Собственно код:

http://pastebin.com/qrXXHSyU

http://pastebin.com/xq4C4wxr

http://pastebin.com/iqvUMJDs

Вывод такой

db opened successfull. query created. Entering sqlWorker::~sqlWorker() ... QSqlDatabasePrivate::removeDatabase: connection 'workDB' is still in use, all queries will cease to work. workDB status : CLOSED Entering sqlVersion(). Sending query->exec() Программа неожиданно завершилась.

★★★★★

1) приватные поля тут не при чём

2) не пиши такую клюкву в конструкторе __никогда__ (!), в конструкторе делай только явную инициализацию ресурсов, ибо обрабатывать ошибки в конструкторе так же удобно как ездить по кочкам на велосипеде без седла

shty ★★★★★
()

Так делать нельзя:

//sqlworker.cpp
sqlWorker::sqlWorker()
{
    sqlWorker(DEFAULT_HOSTNAME, DEFAULT_DBNAME, DEFAULT_USERNAME, DEFAULT_PASSWORD);
}
Можно делать так:
//sqlworker.h
sqlWorker(const QString &hostName = DEFAULT_HOSTNAME, const QString &dbName = DEFAULT_DBNAME, const QString &userName = DEFAULT_USERNAME, const QString &pwd = DEFAULT_PASSWORD);

Рекомендую изучить C++, в дальнейшем пригодится.

schizoid ★★★
()

более короткий пример, показывающий всю неправильность ситуации:

#include <QtCore/QCoreApplication>
#include <QDebug>
class test
{
public:
    test(int a, int b) { qDebug()<<"start"<<this<<a<<b;}
    test()             { qDebug()<<"start"<<this;       test(2,3); }
    ~test()            { qDebug()<<"stop"<<this;}
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    {
        test t;
    }
    return a.exec();
}
$ ./test
start 0x28ff27
start 0x28feff 2 3
stop 0x28feff
stop 0x28ff27
Ожидал создать один объект класса, получилось создать два.
Читать про классы и конструкторы.

anonymous
()

Всем поучаствовавшим огромное человеческое, осознал свою глупость, исправлюсь.

Ivan_qrt ★★★★★
() автор топика
Ответ на: комментарий от Ivan_qrt

малость не в тему:
классы желательно с большой буквы называть
и #define использовать как можно реже, константы же есть

dt1 ★★
()
Ответ на: комментарий от dt1

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

meil
()
Ответ на: комментарий от meil

жир течет с моего монитора

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

а вообще, нижний регистр для названий классов уместно использовать только для системных вещей, в остальных случаях сразу видно школоту с завышенным ЧСВ

dt1 ★★
()
Ответ на: комментарий от dt1

мое мнение, все что с большой буквы изварт) синтаксис интерфейсов stl и boost'a вполне адекватный :) правда вторым я почти не пользуюсь.

сразу видно школоту с завышенным ЧСВ

то-то и оно :)

meil
()
Ответ на: комментарий от meil

В Qt всё нативное вообще с QДвух QЗаглавных начинается. Ну и рекомендуется там насколько я помню именно верблюжий с первой заглавной для классов.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Придерживаться стиля фреймворка - это отлично) никто же это не отрицает. Просто есть стандарт языка, почему бы его одновременно и не использовать как стандарт написания кода на с++? и эти ваши разные либы разрабатвать используя уже существующие наработки как по библиотекам так и по стилю? относительно кьют : собрание велосипедов на с++, если полезешь внутрь - поймешь что реализовано средне. а так как на с++ ничего подобного больше нет... вот и остается.

meil
()
Ответ на: комментарий от Kalashnikov

может и есть у stl какой-то документ, я не видел. я писал многими разными стилями в разных проектах и с опытом понимаешь, что истина она чем-то похожа на оформление stl :) опять же я никого не заставляю что-то менять в себе) это как-то с возрастом приходит.

Был как-то препод в универе он ставил всем студентам любую оценку, какую только они хотели. И на вопрос почему, он ответил : пока они все остаются тупыми, у меня есть работа.

meil
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.