Название: Наследование QSqlQuery Отправлено: SABROG от Июнь 14, 2007, 10:36 Ух до чего же я ненавижу писать классы с их подводными камнями :evil:
Никак не получается унаследовать QSqlQuery. Хочу унаследовать так, чтобы переопределить методы exec(const QString &) и exec(), но при этом чтобы передаваемые параметры в конструктор остались такими же как и в QSqlQuery. --- Сам разобрался. // sabQuery.h Код:
// sabQuery.cpp Код:
Название: Наследование 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 Однако метод базового класса не исчезает. Просто при поиске имени 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 Вот такое объявление увидел в классе, можете объяснить что это такое :) ?
Код:
Название: Наследование 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" Вот такое объявление увидел в классе, можете объяснить что это такое :) ? Код:
Предполагаю, что это чисто виртуальная константная функция-член, возвращающая указатель на константу типа(ну, типа-а-а, имеющую тип) char. О том, что она чисто виртуальная функция говорит = 0. Класс, имеющий хотя бы одну такую функцию, называется абстрактным. Экземпляр такого класса создать нельзя. Const после foo() говорит о том, что функция-член - константная. Это означает что она может проверять состояние объекта, но не может вносить изменения. Если внутри такой функции-члена ты захочешь изменить значение какой-нибудь переменной-члена, то компилятор покажет тебе фигушку. Собственно все. Название: Наследование QSqlQuery Отправлено: SABROG от Июнь 15, 2007, 18:37 Сложная функцию. Т.е. я не могу создать экземпляр например так ?:
Код:
Но могу использовать ее так ?: Код:
Неужели есть такие программисты, которые настолько параноидально огораживают свои классы барьером различных условий, дабы компилятор выдал им ошибку, типа: "забылся Василий!". Название: Наследование QSqlQuery Отправлено: Insomniac от Июнь 15, 2007, 19:12 Я полагаю, что ты должен создать наследника от этого абстрактного класса, в котором определишь эту функцию.
Пример. Ты - Бог и решил заселить мир жЫвотными. Ты решаешь, что каждое жЫвотное может жрать, спать и срать, и создаешь общий для всех класс "жЫвотное". НО! Каждое создание божье это делает по своему. С другой стороны если ты создашь экземпляр такого "жЫвотного", которое жрет, спит и все остальное делает неизвесно как, то это будет фильм ужасов, а не заселенный мир. Поэтому ты, о мудрый создатель, обзываешь все эти методы чисто виртуальными. Теперь ты создаешь новые классы "мышь" и "кошь", наследуя их от "жЫвотного", и у них определяешь эти методы - для каждого по-своему. Короче, если я правильно понял, то абстрактные классы - это путь к полиморфизму. Название: Наследование QSqlQuery Отправлено: SABROG от Июнь 15, 2007, 21:16 А зачем мне нужны вообще эти виртуальные методы, которые надо переопределять, если кто-то другой сам может ввести новые методы на "посрать", "поспать" и еще чего-нибудь. А то глядишь "кошь" родится с генетическими отклонениями и не сможет "посрать" и через какое-то время умрет от интоксикации, к примеру.
Название: Наследование QSqlQuery Отправлено: Insomniac от Июнь 15, 2007, 21:55 Цитата: "SABROG" ... А то глядишь "кошь" родится с генетическими отклонениями и не сможет "посрать" и через какое-то время умрет от интоксикации, к примеру. Естественный отбор :). А вообще С++, как и Россию - умом не понять. Он слишком объемен, чтобы прочитать книгу и сказать:"О! мне все ясно! Пойду спать." У меня несколько книг, бумажных и электронных, и я периодически их читаю и пытаюсь понять. Проблема в том, что приведенные в книгах примеры предназначены только для демонстрации техники программирования, поэтому смотря на них думаешь: "Какого... такую простую вещь делать с таким сложностями". Все эти заморочки проявляют себя в больших проектах. И есть примеры, как надо и как не надо программировать на С++ с использованием объектного программирования. Пример, как надо использовать С++ - догадайся с первого раза. Правильно - Qt. Как не надо - MFC. Предупреждаю сразу - это ИМХО 8) , а не призыв к Халивару, поэтому спорить на тему, кто из них лучше, категорически не буду. |