Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Стратегический вопрос.


Автор: Royan 1.4.2004, 17:53
У меня в прорамме планируется быть осциллограф. Будет сниматься аудио сигнал и выводиться на маленький нарисованный мной экранчик. Вопрос:

Как наболее грамотно сделать поледовательную прорисовку элементов.

1) Запихать все функции выводящие графическую информацию в одну процедуру вызываемую при сообщении WM_PAINT

или

2)У меня уже есть класс "оболочка" В нем можно ассоциировать какой-то член класса (например виртуальную функцию) с конкретным сообщением, так вот можно ли вызывав например такую виртуалную функцию унаследованного класса, вызвать еще и ее бызовую копию. Например:
Код
class Base{
 virtual int foo(){

  //Выводим рамку
 }
};
class Der: public Base{

int foo(){
  //Выводим содержание
}

};


Это надо для того чтобы можно было построить иерархию классов, и каждый из них добавил бы свою функцию обработки WM_PAINT, как следствие программа была бы логически построена и хорошо инкапсулирована.

Автор: Масяня 1.4.2004, 18:34
Цитата

.... так вот можно ли вызывав например такую виртуалную функцию унаследованного класса, вызвать еще и ее бызовую копию...


Конечно, можно! Для отключения виртуального механизма вызова вирт. функций используй оператор разрешения обасти видимости. Например, так Base::foo().

Автор: Гость_Tinto 1.4.2004, 19:25
Не знаю как вы делаете, а я сделал так. Данные приходят пакетами через СОМ-порт с периодом 120мс. Пакет обрабатывается и выводится на экран(TeeChart) и все. Единственно узкое место здесь, это лимит времени на обработку данных не более 120мс. Аналогично можно вводить данные и со звуковухи, только надо программный буфер предусмотреть, т.к данные со звуковухи идут непрерывно. А вообше-то зачем заморачиваться, если есть готовая программа, SpectraLab называется baaa.gif

Автор: cardinal 1.4.2004, 20:25
Модератор: Название темы должно отражать ее суть!

Автор: Royan 1.4.2004, 20:48
2Cardinal, раз модератор да еще такой умный, то и предложи, а то вишь замечания тут радзовать
2МасяняBase::foo() вызовет только foo() из Base, а мне надо так чтобы одним вызовом foo() где либо вызвались все foo в иерархии классов, подобно тому как вызываются конструторы.
2TintoПотому как здесь есть учебный проект и его надо сделать. Суть примерно такова: сделать из звуковухи модем, то есть модулировать входящий сигнал и превращать в цифры.

Автор: srd 1.4.2004, 20:53
Royan
Так можно вызовы цепочкой организовать
Код

class A {
   virtual void f(void) {
        // ...
   }
};
class B : public A {
   void f(void) {
           A::f();
           // ....
    }
};
class C: public B {
     void f(void) {
            B::f();
              //...
       }
};



Автор: Royan 1.4.2004, 20:56
Это я понимаю smile.gif Видимо другого способа и нет. Просто мой первоначальной идеей было написать таким образом чтобы избежать всяких A::f(); и B::f();

Автор: cardinal 1.4.2004, 22:46
Цитата
2Cardinal, раз модератор да еще такой умный, то и предложи, а то вишь замечания тут радзовать

В правилах написано:
Цитата
1) Заголовок сообщения должен кратко отражать суть проблемы, нельзя давать заголовки типа "Помогите", "Срочно нужна помощь", "Есть вопрос", "Очень надо", "Сложный вопрос по программированию" и тому подобное.

Моя задача, как и всех других модераторов, делать замечания участникам форума, если они не придерживаются правил.
Цитата
2Cardinal, раз модератор да еще такой умный

И не надо наезжать на модераторов. Они следят за порядком на форуме.

Цитата
Это надо для того чтобы можно было построить иерархию классов, и каждый из них добавил бы свою функцию обработки WM_PAINT, как следствие программа была бы логически построена и хорошо инкапсулирована.

Ну а если хочешь мое мнение услышать:
для начала надо решить критический это момент или нет
1. если да, то тут, наверно, не до инкапсуляции. Тут речь пойдет (как я понял) об изображении сигналов, так что надо подзадуматься, как бы не напридумывать так, чтобы потом изображение дергалось.
2. если нет, то надо делать так, как удобней тебе (ничего лучшего чем то, что предложил srd предложить не могу).

Автор: Royan 2.4.2004, 09:44
Цитата
И не надо наезжать на модераторов. Они следят за порядком на форуме.

Не умничай biggrin.gif
Цитата
1. если да, то тут, наверно, не до инкапсуляции. Тут речь пойдет (как я понял) об изображении сигналов, так что надо подзадуматься, как бы не напридумывать так, чтобы потом изображение дергалось.

Кстати отличный вопрос, если кто сталкивался с этим, как решали эту проблему?

Автор: Royan 2.4.2004, 10:46
Нашел в FAQ'е и через search:

http://forum.vingrad.ru/index.php?act=ST&f=31&t=19425

http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=7bd51b659398ee0e186cb6087bb8f187&search_in=posts&result_type=topics&highlite=%EC%E5%F0%F6%E0%ED%E8%E5

Автор: mr.DUDA 2.4.2004, 13:23
Royan, а можно упростить себе жизнь вот так wink.gif:
Код
#define BASE(class_name) public: class_name* Base() {return (class_name*)this;}

class A
{
public:
virtual int some(int) {}
virtual void foo() {}
};


class B: public A
{
BASE(A)

virtual void foo() {Base()->foo();}
virtual int some(int val) {Base()->some(val);}
};


class C: public B
{
BASE(B)

virtual void foo() {Base()->foo();}
};

Использование макросов в данном случае даёт более унифицированный внешний вид кода, чем при явном указании имён базовых классов (никаких других выигрышей и проигрышей тут нету, т.к. функция Base() будет inline, т.е. подставляемая, и к тому же кроме cast-а ничего не содержит). Сравни с тем же примером, но без Base():
Код
class A
{
virtual int some(int) {/* ... */}
virtual void foo() {/* ... */}
};


class B: public A
{
virtual void foo() {A::foo(); /* ... */}
virtual int some(int val) {A::some(val); /* ... */}
};


class C: public B
{
virtual void foo() {B::foo(); /* ... */ }
};

не надо загоняться на имена базовых классов, а достаточно вызвать Base( )...

Автор: Royan 3.4.2004, 15:29
Да ты прав, я думал предложить свой вариант, когда на этапе компиляции составляется карта в конструкторе каждого из унаследованных классов, а после ее в бызовом классе раскрутить в цикле, так как OnMyPaint базового класса вызывается по умолчанию, но потом до меня дошло, что это все равно то же самое, что предложил и ты, покуда пришлось бы прописывать в каждом конструкторе лишнюю строчку кода smile.gif

Автор: mr.DUDA 3.4.2004, 21:49
Угу, только в моём коде ни одной лишней строчки компилятор не генерит smile.gif.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)