абстрагирование от платформы - виртуальный функции

Тема в разделе "LANGS.C", создана пользователем maksim_, 21 янв 2010.

  1. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Зачем представлять, достаточно попробовать собрать его же код, что не получится.
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    cupuyc
    такое бывает. и решается, обычно так, - в поплатформенных сорцо папках добавляются хидеры с объявлениями вспомогательных поплатформенных классов, а в общих хидерах - наследуется от них (если, конечно, одну отдельно взятую вспомогательную функцию обязательно надо впихнуть в класс), те в основном хидере

    #include "timerbyplat.h"

    class Timer : public TimerByPlatform
    {
    ...
    };


    а в сорцо поплатформенных, например

    // src/386-nt/timerbyplat.h
    class TimerByPlatform
    {
    public:
    AnOnly386Method(Par1 &par1, Par2 &par2);

    private:
    TheType _386Var;
    };

    //---------------------------------------
    // src/arm-lin/timerbyplat.h
    class TimerByPlatform
    {
    // nothing
    };


    можно и по другому. тут все зависит от сосредоточенности на задаче, а не на отвлекании на вспомогательные операции
     
  3. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    J0E
    Ты о чем джой? Ясно, что не получится. Если у меня получилось довести идею до автора, то я свою цель достиг (ты бы еще скаазал что в arm нету ARM7_TIMER)

    cupuyc
    хорошо, конечно. а теперь представь, что каждая реализация класса CTimer имеет какие-то уникальные члены класса и методы. как будет выглядеть хидер? куча #if'ов?

    Кажется до меня наконец дошло, что тебе нужно. Тебе нужно один раз определить интерфейс и от него унаследовать несколько классов-реализаций, но при этом не хочешь использовать #if ?

    Я бы мог тебе посоветовать создать заголовки классов, для каждой платформы свой и включать необходимый из мейкфайла, на этапе сборки (g++ -I $(PLAT)).
    Но ты хочешь еще следить за интерфейсом этих классов? - Используй оба этих метода: используй статическое наследование (чтобы следить за интерфейсом) и выбирай откуда брать заголовки на этапе компиляции (мейкфайл, .vcproj и.т.д).
     
  4. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    letopisec вобщем-то уже всё обсудили. можно юзать CRTP, можно PIMPL - не в этом суть. есть базовый класс, CTimerBase. есть куча реализаций, описаных в хидерах. все реализации привязаны к базовому классу пимплом или сртп. в базовом хидере есть что-то типа

    Код (Text):
    1. #if CURRENT_PLATFORM == _SAM7_
    2.  #include "sam7/timer_sam7.h"
    3.  typedef CTimerBase<CTimerImpl> CTimer
    4. #elif CURRENT_PLATFORM == ...
    5.  ...
    6. #endif
    вот вобщем-то и вся проблема.
     
  5. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    maksim_
    посмотри еще на вариант из #32
    typedef PLATFORM_NAME::Object Object;
    PLATFORM_NAME - это макрос, так можно и без #ifdef

    Я хотел сказать #39 другими словами, что ARM7_TIMER нету не в арм, а среди членов класса.
     
  6. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    не понятно как быть с пинами. на данный момент создал класс CPin(uint i_pin); и методы set_value(bool); bool get_value(); set_as_output(); set_as_input() и пр.

    все порты объединил в одно адресное пространство пинов (чтобы не привязываться к разрядности порта в конкретной архитектуре). типа, PORTA pin0 .. pin7; PORB pin8 .. pin15 и т.д.

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

    CPin *p1 = new CPin(20);
    CPin *p2 = new CPin(20);

    можно, конечно, сделать конструктор приватным, создать шаблонный класс template<uint i_pin> CPinT ... ну и статические методы init, get_instance и пр. затем определить 32 класа

    typedef CPiTn<0> CPin0;
    typedef CPiTn<1> CPin1;
    ..
    typedef CPiTn<31> CPin31;

    как-то коряво, вобщем.

    какие есть соображения?