Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 22.12.2010, 16:06  
Красный Свин
Частый гость
 
Регистрация: 12.10.2010
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
Красный Свин на пути к лучшему
По умолчанию Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Сообщение от Profyelec Посмотреть сообщение
Да - да. Именно не о статических. Иначе писалось бы все на чистом С.
1. Абсолютно непонятно, что требуется в общем случае. Удалять гланды через задницу красиво и методологически правильно просто невозможно в принципе. Весь приведенный выше говнокод можно свести к классике, типа:
//-----------------
class ClassA
{
public:
ClassA() {iSomeData = 0xdead;}
virtual void Visit() {printf("ClassA::Visit()\n");}

private:
int iSomeData;
};

//-----------------
class ClassB : public ClassA
{
public:
virtual void Visit() {printf("ClassB::Visit()\n");}
};

//-----------------
class ClassC : public ClassA
{
public:
virtual void Visit() {printf("ClassC::Visit()\n");}
};


int main(int argc, char* argv[])
{
ClassA ca;
ClassB cb;
ClassC cc;

ca.Visit();
cb.Visit();
cc.Visit();

return 0;
}

2. Если главная задача - допилить напильником что-то уже существующее, то из оригинального поста непонятно, что же надо сделать. Кто мешает использовать наследование и нормальную перегрузку виртуальных функций ? Если уж так хочется геморроя, можно построить иерархию классов, в базовом классе сделать указатель на перегружаемую виртуальную функцию и с ним играться. Более того,
class_b::class_b()
{
ca = new class_a();
...
}

Это просто кривая попытка наследования. Рекомендую почитать что-нибудь типа "Scott Meyers, Effective C++", "Alecsandrescu, Modern C++ design", там весьма хорошо расписаны примеры private наследования, функторов итп.
Реклама:
Красный Свин вне форума  
Непрочитано 22.12.2010, 17:10  
Profyelec
Прохожий
 
Аватар для Profyelec
 
Регистрация: 13.02.2010
Сообщений: 9
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
Profyelec на пути к лучшему
Вопрос Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Объясняю:
класс class_a - отдельный класс работы с UART'ами (вариант который работает в винде работает соответственно с СОМ портами)
класс class_b - класс логики и обработки потока данных от кассового аппарата
класс class_c - класс логики и обработки потока данных для работы например с первым банковским терминалом
также могут быть и другие классы которые работают с другими устройствами
Например:
класс class_d - класс логики и обработки потока данных для работы со вторым банковским терминалом
класс class_e - класс логики и обработки потока данных для работы с терминалом смаркарт.

Рабочий код есть уже реализованный под винду, без больших затрат переносится на МК. Но единственная на данный момент проблема так эта та что в классе class_a нужно установить указатель на обработчик принятого потока данных виртуального метода соответствующего класса(class_b::func_b(), class_c::func_c(),....).

И не только конкретно в классе class_a есть такие события, на которые нужно навешать обработчик, но и например в классе class_c есть событие которое возникает при вставке банковской карточки....
Profyelec вне форума  
Непрочитано 22.12.2010, 17:47  
Красный Свин
Частый гость
 
Регистрация: 12.10.2010
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
Красный Свин на пути к лучшему
По умолчанию Re: Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Сообщение от Profyelec Посмотреть сообщение
Объясняю:

Рабочий код есть уже реализованный под винду, без больших затрат переносится на МК. Но единственная на данный момент проблема так эта та что в классе class_a нужно установить указатель на обработчик принятого потока данных виртуального метода соответствующего класса(class_b::func_b(), class_c::func_c(),....).

И не только конкретно в классе class_a есть такие события, на которые нужно навешать обработчик, но и например в классе class_c есть событие которое возникает при вставке банковской карточки....
Лехко!
1. Уходим курить умные книжки по паттернам программирования, начиная с visitor.
2. пишем что-то типа:
//---------------------
/** mix-in, pure interface for data processor classes */
class MDataProcessing
{
public:
virtual void ProcessData() = 0;
};

//---------------------
/** my concrete data processor */
class CDataProcessor : public MDataProcessing
{
public:
CDataProcessor() {/* do something */}

virtual void ProcessData() {printf("CDataProcessor::ProcessData() \n");}
};

//---------------------
/** abstract base class for data providers */
class CDataProviderBase
{
public:
CDataProviderBase(MDataProcessing& aDataProcessor) : iDataProcessor(aDataProcessor) {}

virtual ~CDataProviderBase() = 0 {}
virtual void HasData() = 0;

protected:

MDataProcessing& iDataProcessor; //-- interface to the data processor
};

//---------------------
/** a concrete data provider*/
class CDataProviderA : public CDataProviderBase
{
public:
CDataProviderA(MDataProcessing& aDataProcessor) : CDataProviderBase(aDataProcessor){}

virtual ~CDataProviderA() {}
virtual void HasData();

};

//---------------------
/** a concrete data provider*/
class CDataProviderB : public CDataProviderBase
{
public:
CDataProviderB(MDataProcessing& aDataProcessor) : CDataProviderBase(aDataProcessor){}
virtual ~CDataProviderB() {}
virtual void HasData();

};

void CDataProviderA::HasData()
{
printf("CDataProviderA::HasData()\n");
iDataProcessor.ProcessData();
}

void CDataProviderB::HasData()
{
printf("CDataProviderB::HasData()\n");
iDataProcessor.ProcessData();
}


int main(int argc, char* argv[])
{
CDataProcessor dataProcessor;

CDataProviderA dA(dataProcessor);
CDataProviderB dB(dataProcessor);

dA.HasData();
dB.HasData();

return 0;
}


3.Убеждаемся, что уже существующий говнодизайн всей системы просто неспособен быть более-менее приведен к понятию "нормальная расширяемая система с поддерживаемым кодом"

4. посыпаем голову пеплом.
Красный Свин вне форума  
 

Закладки

Метки
c++, iar c++
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь с системой сигнализирования andrey300 Производственное оборудование 1 12.12.2010 16:34
Нужна помощь по схеме Жора Корнев Электроника средств транспорта 5 20.08.2010 17:13
Нужна помощь CDC-232 и atmega16 robin7341 Микроконтроллеры, АЦП, память и т.д 0 08.08.2010 00:13
Нужна помощь с картой SD в режим SD! (не SPI) backa Микроконтроллеры, АЦП, память и т.д 2 23.04.2010 15:28
AVR Studio и AT89S51 - нужна помощь roobeeaz Микроконтроллеры, АЦП, память и т.д 5 13.03.2010 18:34


Часовой пояс GMT +4, время: 21:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot