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

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

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

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

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

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

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

 
Опции темы

Нужна помощь в С++ IAR(Обектно-ориентированное програмирование)

Непрочитано 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:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.