Название: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 09:57 Срочно нужна помощь!
Есть класс Код: 8 class smartQuery: public QSqlQuery перегрузили метод exec(QString); Код: 24 bool smartQuery::exec (const QString str) Код: smartQuery sq; Код: 32 dbg->sql(str); если раскоментировать clear() = слетит там. gdb показывает: Код: Program received signal SIGSEGV, Segmentation fault. Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 10:21 перегрузили метод exec(QString); Ты не перегрузил метод exec().Код: 24 bool smartQuery::exec (const QString str) Описание метода exec: Код: bool QSqlQuery::exec( const QString & str ); Почему ты везде передаешь в метод строку, а не константную ссылку? Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 10:58 Спасибо за помощь!
Перегрузил: Код: 24 bool smartQuery::exec () ничего не изменилось =( приложил файл реализации. может будет удобнее. изменил методы exec на virtual bool появился warning при компиляции Код: ../smartQuery/src/smartQuery.h:9: предупреждение: ‘class smartQuery’ has virtual functions but non-virtual destructor Код: undefined reference to `smartQuery::~smartQuery()' Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 11:07 А версия Qt какая?
В Qt3 exec( const QString &) - виртуальный, а в Qt4 - нет. Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 12:05 Qt 4.3.
Я попробовал просто наудачу. Щас сделал как было. Почему ошибка происходит когда выполняется метод родителя? то есть либо exec() либо clear() - и все segfault может в конструкторах что-то? Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 12:09 А у тебя компилябельный пример есть? Можешь сделать простой проект только с этим классом?
Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 12:31 во вложении.
всё компилится и работает =-O в основном проекте не хочет =( Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 12:40 во вложении. Сделай нормальный конструктор копирования и оператор присвоения.всё компилится и работает =-O в основном проекте не хочет =( Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 12:59 Цитировать Оказывается explicit скрывает конструктор так, как даже private не может. Т.е. его как будто нет. Во втором случае вызовется конструктор для double без каких-либо предупреждений, что может быть довольно неожиданным поворотом событий. Будьте бдительны. Конечно, если написать explicit для обоих конструкторов, то будет все в порядке и не будет таких опасных ситуаций. Поэтому explicit следует писать для всех конструкторов с одним параметром. /usr/include/qt4/Qt/qsqlquery.h Код: 59 QSqlQuery(QSqlResult *r); я чето ваще уже ниче не понимаю %( Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 13:09 Определи:
Код: smartQuery( const smartQuery & ); Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 13:27 а можно использовать swap?
Код: smartQuery &operator=( const smartQuery & other) Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 13:50 Код: smartQuery &TestQuery::operator=( const smartQuery &query ) Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 14:02 при компиляции warning:
Код: ../smartQuery/src/smartQuery.cpp: In copy constructor ‘smartQuery::smartQuery(const smartQuery&)’: Код: 29 qDebug() << QObject::tr("Конструктор без параметров"); Код: "Конструктор без параметров" Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 14:18 а в основной опять та же херь! >_< В тестовом примере класс работает, а в проекте нет?Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 14:23 да.
щас кароче попробовал перед использованием объекта в основной использовать конструктор копирования Код: 24 smartQuery sq2 = sq; если использовать sq - будет segfault если sq2 - всё пашет. =-O Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 14:42 Такой еще вопрос. У smartQuery деструктора не описан, при его разрушении dbg не удаляется?
Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 15:10 нет. я пробовал создавать dbg объектом, а не указателем. та же песня.
Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 08, 2008, 15:38 нет. я пробовал создавать dbg объектом, а не указателем. та же песня. У меня не получается смоделировать segfault в тестовом примере. Если у тебя получиться это сделать, сбрось архив с проектом.Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 08, 2008, 16:01 ок. завтра. щас домой. спасибо за помощь!
Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 09, 2008, 07:38 Код: class Huis Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 09, 2008, 08:46 А объект создавать кто будет?
Код: int main(int argc, char ** argv) Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 09, 2008, 09:04 А объект создавать кто будет? Код: int main(int argc, char ** argv) Код: Huis *x = new Huis; Код: Huis *x; Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 09, 2008, 09:09 я чето не догоняю? В приведенном тобой выше примере, ты объявляешь указатель на Huis и сразу начинаешь его использовать, без создания самого объекта.Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 09, 2008, 09:13 я чето не догоняю? В приведенном тобой выше примере, ты объявляешь указатель на Huis и сразу начинаешь его использовать, без создания самого объекта.Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 09, 2008, 09:17 Код: int main(int argc, char ** argv) объект объявлен и сразу инициирован при помощи new. ты точно уверен что это может являться причиной? Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 09, 2008, 09:20 А объект создавать кто будет? сразу посмотрел в твой пост и не обратил внимания на свой. сорри.Код: int main(int argc, char ** argv) щас разберусь с основным проектом. тестовый работает.. почему?? Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 09, 2008, 09:27 тестовый работает.. почему?? А тут может быть, что угодно. :)Где-то, что-то делаешь не так в основном проекте, не видя всего трудно что-то сказать определенное. Ошибка может быть не обязательно в этом классе. Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 09, 2008, 09:28 Код: 3 smartQuery::smartQuery ( QSqlResult * result ) : QSqlQuery(result) Код: Constructor by string and database что делать с конструкторами? %( Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 09, 2008, 09:43 Пока я не смогу это воспроизвести у себя, трудно что-то сказать.
Покажи класс который использует smartQuery. Может там что-то. И заодно полностью покажи (h и cpp) smartQuery, в текущем виде. Название: Re: Наследование. Segmentation fault Отправлено: xintrea от Декабрь 09, 2008, 19:04 Выложи полный проект, в котором сегфолтица, не мучай людей догадками.
Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 10, 2008, 13:58 Код: ../smartQuery/src/smartQuery.cpp: In copy constructor ‘smartQuery::smartQuery(const smartQuery&)’: похоже (я начинаю догадываться): базовый класс должен быть явно инициализирован в конструкторе копирования буду пробовать Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 11, 2008, 13:59 всё же я нашел ответ на этот сегфолт =)
всё оказалось очень просто: Наследование QSqlQuery._Segfault (http://bsdhome.org/index.php/%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_QSqlQuery._Segfault) Название: Re: Наследование. Segmentation fault Отправлено: shade-khv от Декабрь 12, 2008, 03:06 Это у вас класс который реализует нормальную работу с запросами?
Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 12, 2008, 07:14 да. более удобное использование запросов. отдельные методы update insert select. а также дополнительные проверки и отладочные сообщения
Название: Re: Наследование. Segmentation fault Отправлено: shade-khv от Декабрь 12, 2008, 08:27 Насколько я понимаю готовый запрос распарсить на order, keys, values класс не способен?
Вообще интересно, должен же быть какой то общий, эталонный, чтоли, алгоритм разбора запроса (по крайней мере соответсвующего стандарту) на части? Сами то СУБД его как то разбирают. Хотя, по моему Posgtes использует yacc для разбора (не уверен). У меня есть мой класс в PHP, который работает с запросами, но метод разбиения там написан топорно: Код
А вообще грамотный класс работы с запросами мне очень-очень интересен. Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 12, 2008, 09:19 меня интересует один вопрос: зачем это нужно?
если ответишь - могу помочь, но несколько настораживает реализация. если нужно именно на PHP - думаю здесь не место. Название: Re: Наследование. Segmentation fault Отправлено: shade-khv от Декабрь 12, 2008, 09:52 Нет, на PHP у меня уже всё схвачено, я просто для примера привел.
Смысл такой что создавать объект проще. Можно создать его передав ему строку запроса (только что созданного и проверенного в PgAdmin-е, например). При создании в конструкторе строка разберется на where, sort, group и прочие части, каждую из которых можно легко менять. Например, чтобы позволить пользователю в процессе работы выбирать какие столбцы запрашивать из БД. Название: Re: Наследование. Segmentation fault Отправлено: shade-khv от Декабрь 12, 2008, 09:59 Просто я не совсем понял как будет строиться запрос если мы создали объект конструктором
smartQuery ( const QString &query = QString(), QSqlDatabase db = QSqlDatabase()); Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 12, 2008, 10:40 допустим, часто используется конструкция добавить/изменить
Код то есть smartQuery можно использовать как стандартную QSqlQuery с возможностью указать запрос в конструкторе, а также задействовать дополнительные методы, верные только для нее Название: Re: Наследование. Segmentation fault Отправлено: ритт от Декабрь 12, 2008, 10:53 Цитировать QString QSqlDriver::escapeIdentifier ( const QString & identifier, IdentifierType type ) const [virtual] Returns the identifier escaped according to the database rules. identifier can either be a table name or field name, dependent on type. Цитировать QString QSqlDriver::formatValue ( const QSqlField & field, bool trimStrings = false ) const [virtual] Returns a string representation of the field value for the database. This is used, for example, when constructing INSERT and UPDATE statements. The default implementation returns the value formatted as a string according to the following rules: If field is character data, the value is returned enclosed in single quotation marks, which is appropriate for many SQL databases. Any embedded single-quote characters are escaped (replaced with two single-quote characters). If trimStrings is true (the default is false), all trailing whitespace is trimmed from the field. If field is date/time data, the value is formatted in ISO format and enclosed in single quotation marks. If the date/time data is invalid, "NULL" is returned. If field is bytearray data, and the driver can edit binary fields, the value is formatted as a hexadecimal string. For any other field type, toString() is called on its value and the result of this is returned. Цитировать QString QSqlDriver::sqlStatement ( StatementType type, const QString & tableName, const QSqlRecord & rec, bool preparedStatement ) const [virtual] Returns a SQL statement of type type for the table tableName with the values from rec. If preparedStatement is true, the string will contain placeholders instead of values. This method can be used to manipulate tables without having to worry about database-dependent SQL dialects. For non-prepared statements, the values will be properly escaped. Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 12, 2008, 13:30 Цитировать QString QSqlDriver::escapeIdentifier ( const QString & identifier, IdentifierType type ) const [virtual] Returns the identifier escaped according to the database rules. identifier can either be a table name or field name, dependent on type. Цитировать QString QSqlDriver::formatValue ( const QSqlField & field, bool trimStrings = false ) const [virtual] Returns a string representation of the field value for the database. This is used, for example, when constructing INSERT and UPDATE statements. The default implementation returns the value formatted as a string according to the following rules: If field is character data, the value is returned enclosed in single quotation marks, which is appropriate for many SQL databases. Any embedded single-quote characters are escaped (replaced with two single-quote characters). If trimStrings is true (the default is false), all trailing whitespace is trimmed from the field. If field is date/time data, the value is formatted in ISO format and enclosed in single quotation marks. If the date/time data is invalid, "NULL" is returned. If field is bytearray data, and the driver can edit binary fields, the value is formatted as a hexadecimal string. For any other field type, toString() is called on its value and the result of this is returned. Цитировать QString QSqlDriver::sqlStatement ( StatementType type, const QString & tableName, const QSqlRecord & rec, bool preparedStatement ) const [virtual] Returns a SQL statement of type type for the table tableName with the values from rec. If preparedStatement is true, the string will contain placeholders instead of values. This method can be used to manipulate tables without having to worry about database-dependent SQL dialects. For non-prepared statements, the values will be properly escaped. Название: Re: Наследование. Segmentation fault Отправлено: BRE от Декабрь 12, 2008, 13:39 кхм.. это к чему? Это к тому, что есть штатные средства, которые формируют строки запросов, причем опираясь на специфику конкретной базы данных (в зависимости от драйвера).;) Название: Re: Наследование. Segmentation fault Отправлено: MechanicalBear от Декабрь 15, 2008, 07:38 это не по моей теме
|