Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
kexman писал(а):
Вопросик есть - по поводу auto_ptr - когда его использовать? А когда обычные указатели+delete?
Никогда Использовать стоит лишь тогда, когда ты проводишь обработку эксепшенов, чтобы при выходе из скопа, в случае stack unwinding вызвался деструктор контейнера и освободил память объекта. Не используй как поле класса.
kexman писал(а):
В общем я разочаровался, и подумал, что зря потратил деньги. Зато сейчас понял, что купил очень хорошую книгу )
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Daemon. Вчера в шоке был, прочел у Мейерса правило "Рассмотрите альтернативы виртуальным функциям". Это сильно Есть вопрос к тебе - по проектированию - он связан с QT - ты же юзал эту библиотеку? Я уже голову сломал, достаточно объемный вопрос.
У меня в программе есть два основных виджета графическое QGraphicsView и дерево - QTreeView. В обоих окнах отображаются одни и те же объекты - в QGraphicsView их графическое представление, в QTreeView их иерархия. Мне нужно контекстное меню, причем для разных типов графических объектов оно должно отличаться. Для обоих виджетов, чтобы обработать событие контекстного меню надо переопределить виртуальную функцию contextMenuEvent. Приведу ее реализацию для TreeView, для графического виджета она будет аналогична:
Код:
void MyTreeView::contextMenuEvent(QContextMenuEvent *event) { /*Участок кода, в котором контейнер objects заполняется списком указателей на выделенные объекты. Для обработчика контекстного меню в QGraphicsView есть аналогичный кусок*/
/*Здесь должно вызываться контекстное меню в точке экрана event->globalPos() Приведу стандартный код вызова контекстного меню на QT*/
QMenu menu(this); menu.addAction(cutAct); menu.addAction(copyAct); menu.addAction(pasteAct); ... // действия зависимые от типа выделенных объектов menu.exec(event->globalPos());}
В общем у меня есть этот обработчик в разных классах. Поскольку по логике программы объекты одни и те же, меню должно быть тоже одним и тем же. Недолго думая я сделал класс TMenuManager, который выводит контекстное меню и стал вызывать его из обработчиков обоих виджетов:
Код:
void MyTreeView::contextMenuEvent(QContextMenuEvent *event) { /*Участок кода, в котором контейнер objects заполняется списком указателей на выделенные объекты. Для обработчика контекстного меню в QGraphicsView есть аналогичный кусок*/
/*Создание объекта класса TMenuManager, передача ему в качестве параметров event - для вывода меню в точке event->globalPos() и контейнера с выделенными объектами - чтобы заполнить это меню.*/
Все хорошо, вроде, и принципы ООП соблюдены код не дублируется в обоих виджетах. НО. В контестном меню ряд команд таких как cut, copy, delete должны быть доступны и через главное меню приложения. А главное меню формируется аналогичным образом, только в классе главного окна приложения. Там так же создаются Actions, соединяются со слотами обработчиками, в общем так же. Но будет дублирование кода. То есть так понимаю надо сделать по аналогии классу TMenuMnager класс обрабатывающий не только котекстное меню, но и главное меню. Причем этот единый класс должен как-то принимать сообщения от виджетов требующих контекстное меню, в этих сообщениях как я уже говорил должны находиться списки объектов для которых вызывается контекстное меню. В общем я наслышался о механизме ООП, когда один объект посылает сообщения другому, но как это реализовать на практике не знаю. В данной конкретной ситуации вижу 2 варианта, если использовать этот единый класс: 1) Сделать его Singleton'ом. Инклудить этот класс в мои классы MyTreeView и MyGraphicsView и в коде обработчиков событий контестного меню писать что-то в этм роде:
2) Испоьзовать механизм QT - QEvent для передачи сообщений. С ним я толком еще не разбирался, просто вижу такую возможность. В общем что можешь посоветовать?
Member
Статус: Не в сети Регистрация: 18.11.2002 Откуда: не вернуться
Daemon странно на одном сайте нашёл похожий пример так никаких подробностей про это не было (первый раз просто malloc юзаю, раньше он мне как-то не нужен был)
О а под FreeBSD мне GCC сказал что
Цитата:
<malloc.h> has been replaced by <stdlib.h>
Прикольно
_________________ Летели гуси-лебеди, а им навстречу - воробьи-пингвины и соловьи-страусы...
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Daemon Структура программы, которую пишу в принципе ничем не отличается от типичных приложений-редакторов. Может есть какая-то блок-схема для стандартных приложений? С иерархией классов, их функциональностью. Потому что я начал смотреть сорцы QT Designer - судя по всему очень грамотно спроектированная прога. Разбираю сорцы, я не могу пройти по цепочке в поиске обработки контекстного меню, оборвался на каком-то интерфейсном классе, а далее непонятно.
Народ возникла проблема пишу программу на С++ у меня есть переменная типа FILE* надо удалить этот файл не зная пути.
Я в другой функции открываю файл к примеру file_=fopen("C:\1.txt","r+");
Ну вот функция возвращает только переменную file_ она естественно типа FILE* вот мне надо удалить файл связанный с переменной file_
Member
Статус: Не в сети Регистрация: 09.08.2005 Откуда: Земля
А кто-нибудь сткруктуры понимает?
Описать стpуктуpный шаблон с именем PRICE,
содержащий следующие элементы:
- TOVAR - название товара (символьный массив);
- MAG - название магазина, в котором продается товар (символьный массив);
- STOIM - стоимость товара в рублях (тип float).
Написать программу, выполняющую следующие действия:
1 - ввод с клавиатуры данных в массив SPISOK, состоящий
из элементов типа PRICE;
2 - вывод на экpан:
- всей инфоpмации, размещенной в алфавитном порядке
по названиям товаров;
- вывод на экран информации о товаре, название которого введено с
клавиатуры; если таких товаров нет - выдать на дисплей
соответствующее сообщение.
void VSE (struct PRICE *a,int kol) { int i; for(i=0;i<kol;i++) {printf(" "); puts(a[i].TOVAR); printf(" "); puts(a[i].MAG); printf(" %d\n",a[i].STOIM);} getchar(); getchar();
}
Помогите дописать пункт 2, в частности
- вывод на экран информации о товаре, название которого введено с
клавиатуры; если таких товаров нет - выдать на дисплей соответствующее сообщение(В функции)
Member
Статус: Не в сети Регистрация: 26.01.2006 Откуда: Одесса
Вопрос конечно глуповатый... но пока что в книге ответ найти не смог (наверное плохо искал). Так вот:
Есть ли в С аналоги паскалевских функций ord и chr? Можно конечно спецификаторами формата воспользоваться, но интересуют именно функции.
_________________ Съешь еще этих мягких французских булок, да выпей чаю.
Member
Статус: Не в сети Регистрация: 26.01.2006 Откуда: Одесса
Daemon Да, как я говорил, конечно же можно при помощи спецификаторов. Собственно я так и делал. Но стало интересно, может для этого есть специальные функции?
_________________ Съешь еще этих мягких французских булок, да выпей чаю.
Member
Статус: Не в сети Регистрация: 26.01.2006 Откуда: Одесса
Daemon Уговорили На самом деле писал программу, и было необходимо использовать что-то вроде "chr" из Паскаля. Признаться, С я только начал учить, и не найдя в книге аналогии этой функции, использовал то присваивание, которое вы привели в качестве примера. Но думал, что так не совсем верно, потому и пытался найти "правильные" функции.
mein Примера нет, есть лишь любопытство
_________________ Съешь еще этих мягких французских булок, да выпей чаю.
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Daemonnickyoz А еще лучше оля type у каждого объекта - виртуальную функцию type() у базового класса с переопределением для каждого потомка.
Еще вопросик возник - как в C++ можно контролировать себя на утечки памяти, следить в общем за этим. Сам конечно стараюсь следить, но где-тьо все-равно возможны ошибки, приводящие к утечке. Есть ли какие-нибудь методики для этого?
PropertyDialog - потомок класса QWidget - в конструкторе этого класса надо передавать указатель на виджет родитель, в данном случае это - мой класс MapperMainWindow, тоже являющийся потомком QWidget. Чтобы конструктор QWidget принял в качестве аргумента MapperMainWindow* он должен знать, что этот указатель является потомком QWidget, для этого приходиться инклудить "mappermainwindow.h". Но это совершенно не нужно, так как более в данном файле класс MapperMainWindow не используется. Если не инклудить "mappermainwindow.h", то выдает справедливую ошибку - не могу преобразовать MapperMainWindow* в QWidget*. Пробовал static_cast<> - тоже не идет. Вопрос - как принудительно, без проверки типа преобразовать 1 указатель в другой(В данном случае за безопасность отвечаю сам)? Добавлено спустя 3 минуты, 36 секунд Только что в книжке поглядел, оказывается есть reinterpret_cast<>. Круто
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения