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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Наследование. Segmentation fault  (Прочитано 22924 раз)
MechanicalBear
Гость
« : Декабрь 08, 2008, 09:57 »

Срочно нужна помощь!
Есть класс
Код:
8  class smartQuery: public QSqlQuery
9  {
10 //Q_OBJECT
11 private:
12     QString         query;
13     QString         order;
14     QStringList     keys;
15     QVariantList    values;
16     Debugger        *dbg;
17
18 public:
19             smartQuery  ( QSqlResult * );
20             smartQuery  ( const QString &query = QString(), QSqlDatabase db = QSqlDatabase());
21             smartQuery  ( QSqlDatabase db);
22             smartQuery  ( const QSqlQuery & other);
23
24     bool    exec        (const QString str);
25
26     void    addKey      (QString key);
27     void    addValue    (QString key, const QVariant value);
28     void    setOrder    (QString key);
29
30     void    select      (QString table,
31                             /* WHERE */
32                             QString key = QString(),
33                             QVariant value = QVariant(),
34                             QString sign = QString()
35                             );
36     void    insert      (QString table);
37     void    update      (QString table, /* WHERE */ QString key, QVariant value);
38     void    remove      (QString table, /* WHERE */ QString key, QVariant value);
39 };
Debugger используется для вывода сообщений и прочих дебагов. в конструкторе инициализируется.
перегрузили метод exec(QString);
Код:
 24 bool    smartQuery::exec        (const QString str)
 25 { 
 26     bool result = false;
 27   
 28     keys.clear(); 
 29     values.clear();
 30     order.clear();
 31           
 32     dbg->sql(str);
 33     //clear ();
 34     dbg->sql(str);
 35
 36     //QSqlQuery::prepare(str);
 37     //result = QSqlQuery::exec();
 38     result = QSqlQuery::exec(str);
 39   
 40     if (lastError().isValid())
 41     {
 42         dbg->wrn(lastError().text());
 43         result = false;   
 44     }                     
 45     return result;         
 46 }
создаем объект класса и вызываем exec.
Код:
smartQuery sq;
sq.exec("SELECT * FROM table");
программа слетает segfault-ом при обращении к методам родителя. то есть
Код:
 32     dbg->sql(str);
 33     //clear ();
 34     dbg->sql(str);
 35
 36     //QSqlQuery::prepare(str);
 37     //result = QSqlQuery::exec();
 38     result = QSqlQuery::exec(str);
слетает на QSqlQuery::exec(str);
если раскоментировать clear() = слетит там.
gdb показывает:
Код:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1225332512 (LWP 16800)]
0xb6b79cf3 in mysql_next_result () from /usr/lib/libmysqlclient_r.so.15
« Последнее редактирование: Декабрь 08, 2008, 13:44 от MechanicalBear » Записан
BRE
Гость
« Ответ #1 : Декабрь 08, 2008, 10:21 »

перегрузили метод exec(QString);
Код:
 24 bool    smartQuery::exec        (const QString str)
Ты не перегрузил метод exec().
Описание метода exec:
Код:
bool QSqlQuery::exec( const QString & str );
Сравни со своим (передача строки или передача ссылки на строку).

Почему ты везде передаешь в метод строку, а не константную ссылку?
Записан
MechanicalBear
Гость
« Ответ #2 : Декабрь 08, 2008, 10:58 »

Спасибо за помощь!
Перегрузил:
Код:
 24 bool    smartQuery::exec        ()
 25 {
 26     return QSqlQuery::exec();
 27 }
изменил параметр для exec(QString&)
ничего не изменилось =(
приложил файл реализации. может будет удобнее.
изменил методы exec на virtual bool
появился warning при компиляции
Код:
../smartQuery/src/smartQuery.h:9: предупреждение: ‘class smartQuery’ has virtual functions but non-virtual destructor
если добавить деструктор - будет 
Код:
undefined reference to `smartQuery::~smartQuery()'
после добавления virtual - тоже всё по прежнему =(
Записан
BRE
Гость
« Ответ #3 : Декабрь 08, 2008, 11:07 »

А версия Qt какая?
В Qt3 exec( const QString &) - виртуальный, а в Qt4 - нет.
Записан
MechanicalBear
Гость
« Ответ #4 : Декабрь 08, 2008, 12:05 »

Qt 4.3.
Я попробовал просто наудачу. Щас сделал как было.
Почему ошибка происходит когда выполняется метод родителя?
то есть либо exec() либо clear() - и все segfault
может в конструкторах что-то?
Записан
BRE
Гость
« Ответ #5 : Декабрь 08, 2008, 12:09 »

А у тебя компилябельный пример есть? Можешь сделать простой проект только с этим классом?
Записан
MechanicalBear
Гость
« Ответ #6 : Декабрь 08, 2008, 12:31 »

во вложении.
всё компилится и работает =-O

в основном проекте не хочет =(
Записан
BRE
Гость
« Ответ #7 : Декабрь 08, 2008, 12:40 »

во вложении.
всё компилится и работает =-O

в основном проекте не хочет =(
Сделай нормальный конструктор копирования и оператор присвоения.
« Последнее редактирование: Декабрь 08, 2008, 12:42 от BRE » Записан
MechanicalBear
Гость
« Ответ #8 : Декабрь 08, 2008, 12:59 »

Цитировать
Оказывается explicit скрывает конструктор так, как даже private не может. Т.е. его как будто нет. Во втором случае вызовется конструктор для double без каких-либо предупреждений, что может быть довольно неожиданным поворотом событий. Будьте бдительны.

Конечно, если написать explicit для обоих конструкторов, то будет все в порядке и не будет таких опасных ситуаций. Поэтому explicit следует писать для всех конструкторов с одним параметром.

/usr/include/qt4/Qt/qsqlquery.h
Код:
 59     QSqlQuery(QSqlResult *r);
 60     QSqlQuery(const QString& query = QString(), QSqlDatabase db = QSqlDatabase());
 61     explicit QSqlQuery(QSqlDatabase db);
 62     QSqlQuery(const QSqlQuery& other);
 63     QSqlQuery& operator=(const QSqlQuery& other);
 64     ~QSqlQuery();

я чето ваще уже ниче не понимаю %(
Записан
BRE
Гость
« Ответ #9 : Декабрь 08, 2008, 13:09 »

Определи:
Код:
smartQuery( const smartQuery & );
smartQuery &operator=( const smartQuery & );
Записан
MechanicalBear
Гость
« Ответ #10 : Декабрь 08, 2008, 13:27 »

а можно использовать swap?
Код:
smartQuery &operator=( const smartQuery & other)
{
    swap(other);
    return *this;
}
или как правильно присвоить родителя?
Записан
BRE
Гость
« Ответ #11 : Декабрь 08, 2008, 13:50 »

Код:
smartQuery &TestQuery::operator=( const smartQuery &query )
{
*((QSqlQuery*)this) = (const QSqlQuery&)query; [1]
// QSqlQuery::operator=( (const QSqlQuery &)query ); [2]
return *this;
}
Или первый или второй вариант.
« Последнее редактирование: Декабрь 08, 2008, 17:42 от BRE » Записан
MechanicalBear
Гость
« Ответ #12 : Декабрь 08, 2008, 14:02 »

при компиляции warning:
Код:
../smartQuery/src/smartQuery.cpp: In copy constructor ‘smartQuery::smartQuery(const smartQuery&)’:
../smartQuery/src/smartQuery.cpp:23: предупреждение: base class ‘class QSqlQuery’ should be explicitly initialized in the copy constructor

Код:
29     qDebug() << QObject::tr("Конструктор без параметров");
30     smartQuery sq;
31     smartQuery sq3;
32
33     qDebug() << QObject::tr("Конструктор присваивания");
34     smartQuery sq2 = sq;
35
36     qDebug() << QObject::tr("Операция присваивания");
37     sq3 = sq2;
38
39     sq3.addKey("k");
40     sq3.addKey("value");
41     sq3.select("org");
выводит
Код:
"Конструктор без параметров" 
"Конструктор присваивания"
"Операция присваивания"
"знач 1"
"знач 2"
"знач 3"
...
а в основной опять та же херь! >_<
« Последнее редактирование: Декабрь 08, 2008, 14:05 от MechanicalBear » Записан
BRE
Гость
« Ответ #13 : Декабрь 08, 2008, 14:18 »

а в основной опять та же херь! >_<
В тестовом примере класс работает, а в проекте нет?
Записан
MechanicalBear
Гость
« Ответ #14 : Декабрь 08, 2008, 14:23 »

да.
щас кароче попробовал перед использованием объекта в основной использовать конструктор копирования
Код:
24     smartQuery sq2 = sq; 
25 
26     sq2.addKey("password");
27     sq2.addKey("fullname");
28     sq2.addKey("uid");
29     sq2.addKey("gid");
30     sq2.addKey("orgid");
31     sq2.addKey("orgsecid");
32     sq2.select(_tblUsers, "login", leLogin->text());
sq создается в хидере просто объектом (не указателем)
если использовать sq - будет segfault
если sq2 - всё пашет. =-O
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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