Подскажите шаблон оснастки для кода на C++
От: Аноним  
Дата: 06.01.10 09:22
Оценка:
Есть некий продукт который придется писать на C++, хочется его грамотно оформить, смотрел я на open source проекты, там достато часто все оформлено в cmake , doxygen , cunit. К сожалению разобраться в готовых проектах не получается, много сущностей , не понятно что и зачем. Поэтому хотелось бы разобратся на простом примере.

Допустим нам надо разработать код который бы работал в настоящий момент только в windows, но в будущем есть намеки на то что под linux также потребуется.

Возьмем простейший пример, допустим


//hwbase.cpp;

class CHellowWorldBase
{

 public :
    virtual void PrintHellow();
}

//hwwin32.cpp

class CHellowWordWin32 : public CHellowWorldBase
{
 public :
    void PrintHellow();  
}

//hwlin.cpp
class CHellowWorldLinux : public CHellowWorldBase
{
 public :
    void PrintHellow();  
}

//main.cpp
int main( ... )
{
   CHellowWorld* hw = 0;
   switch ( DetectSystem() )
   {
     case WIN32 :  hw = new CHellowWorldWin32(); break;
     case LINUX :  hw = new CHellowWorldLinux(); break;
   }

   if ( hw != 0 )
    hw->PrintHellow();
}


и ряд вопросов которые возникли :

1. как быть с NULL он использоваться должен повсеместно, но определен в виндовых хедерах — определить свой или ключами компиляции разные хедеры цеплять в зависимости от системы
2. как лучше реализовать специфичные для платформы решения — так как выше приведено в switch() или можно как-то более грамотно разрулить ситуацию, опять же ключами компиляции или как-то еще ?
3. хотелось бы увидеть примеры как это оформить с помощью cmake, cppunit, doxygen
Re: Подскажите шаблон оснастки для кода на C++
От: pva  
Дата: 06.01.10 10:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возьмем простейший пример, допустим

// IMHO, как-то так. Может даже singleton оформить.
class CClassFactory
{
public:
  typedef enum {

    OsTypeWin32,
    OsTypeLinux32

  } OsType_e;

private:
  OsType_e OsType_;

  // ctors.
  CClassFactory()
  {
     DetectOsType(); // private method
  }
  CClassFactory(OsType_e OsTypeValue) : OsType_(OsTypeValue) {}

protected:
  // properties.
  OsType_e OsType() const { return OsType_; }
  ...

public:
  // methods.
  CHellowWorld* CreateHelloWorld() { switch (OsType()) { ... }; }
  CGoodbyeWorld* CreateGoodbyeWorld() { ... }
  ...

};

//main.cpp
int main( ... )
{
  CHellowWorld* hw = CClassFactory::Instance()->CreateHelloWorld();
  hw->PrintHellow();
}
newbie
Re[2]: Подскажите шаблон оснастки для кода на C++
От: alsemm Россия  
Дата: 11.01.10 09:15
Оценка:
Здравствуйте, pva, Вы писали:

И какой смысл определять симейство ОС в рантайме? Ладно, еще уметь различать win xp/vista. А для linux/windows есть дефайны и билдсистема.
Re[3]: Подскажите шаблон оснастки для кода на C++
От: pva  
Дата: 11.01.10 16:41
Оценка:
Здравствуйте, alsemm, Вы писали:

A>И какой смысл определять симейство ОС в рантайме? Ладно, еще уметь различать win xp/vista. А для linux/windows есть дефайны и билдсистема.

А где там написано что определение идет в рантайме?
newbie
Re[4]: Подскажите шаблон оснастки для кода на C++
От: alsemm Россия  
Дата: 11.01.10 18:28
Оценка:
Здравствуйте, pva, Вы писали:

pva>Здравствуйте, alsemm, Вы писали:


A>>И какой смысл определять симейство ОС в рантайме? Ладно, еще уметь различать win xp/vista. А для linux/windows есть дефайны и билдсистема.

pva>А где там написано что определение идет в рантайме?
CClassFactory()
{
    DetectOsType(); // private method
}
Re[5]: Подскажите шаблон оснастки для кода на C++
От: pva  
Дата: 11.01.10 20:43
Оценка:
Здравствуйте, alsemm, Вы писали:

pva>>А где там написано что определение идет в рантайме?

A>
A>CClassFactory()
A>{
A>    DetectOsType(); // private method
A>}
A>


0. Реализация DetectOsType специально не показана.
1. Если это синглетон — вызов будет один раз.
newbie
Re[6]: Подскажите шаблон оснастки для кода на C++
От: alsemm Россия  
Дата: 12.01.10 08:00
Оценка: 1 (1)
Здравствуйте, pva, Вы писали:

pva>Здравствуйте, alsemm, Вы писали:


pva>>>А где там написано что определение идет в рантайме?

A>>
A>>CClassFactory()
A>>{
A>>    DetectOsType(); // private method
A>>}
A>>


pva>0. Реализация DetectOsType специально не показана.

Тот еще секрет:
CClassFactory::DetectOsType()
{
#ifdef _WIN32
    OsType_ = OsTypeWin32;
#else
    OsType_ = OsTypeLinux32;
#endif
}


pva>1. Если это синглетон — вызов будет один раз.

И что? Хоть один, хоть не один — из-за того что выбор реализции CHellowWorld вынесен в рантайм компилировать надо и линукс и виндовз реализацию это интерфейса не зависимо от того, для какой платформы собирается бинарник. Пусть, CHellowWorld выглядит так:

class CHellowWorld
{
public:
    virtual ~CHellowWorld() {}
public:
    virtual void showMessage(const char* msg) = 0;
};


На винде реализация будет:
class CHellowWorldWin32 : public CHellowWorld
{
public:
    virtual void showMessage(const char* msg)
    {
        ::MessageBox(..., msg);
    }
};


На линуксе (CHellowWorldLinux32) что-нибудь GTK-based.

Исходя из вашей логики:
CHellowWorld* CClassFactory::CreateHelloWorld() 
{ 
    switch (OsType()) 
    {
    case OsTypeWin32:
        return new CHellowWorldWin32();
    case OsTypeLinux32:
        return new CHellowWorldLinux32();
    }; 
    return 0;
}


По CClassFactory::CreateHelloWorld() у меня только два вопроса:
1. как оно будет компилироваться?
2. зачем оно вообще нужно?

Вот, если бы у вас было
typedef enum {
    OsTypeWinXp,
    OsTypeWinVista,
    OsTypeWin7
  } OsType_e;

, то тогда да, определение типа ОС в рантайме имеет смысл (оно только в рантайме и возможно). Но ТС задавал другой вопрос.
Re[7]: Подскажите шаблон оснастки для кода на C++
От: pva  
Дата: 12.01.10 10:31
Оценка:
Здравствуйте, alsemm, Вы писали:

A>1. как оно будет компилироваться?

A>2. зачем оно вообще нужно?
Согласен. Чуток поменять нужно
newbie
Re: Подскажите шаблон оснастки для кода на C++
От: Basil2 Россия https://starostin.msk.ru
Дата: 12.01.10 10:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть некий продукт который придется писать на C++, хочется его грамотно оформить, смотрел я на open source проекты, там достато часто все оформлено в cmake , doxygen , cunit. К сожалению разобраться в готовых проектах не получается, много сущностей , не понятно что и зачем. Поэтому хотелось бы разобратся на простом примере.


Прочитайте книгу "Шаблоны проектирования" от Э. Гамма и др. Также посмотрите как устроена библиотека Boost.

Если вы порываетесь делать подобные вещи через switch, это означает что у вас очень серьезные пробелы в проектировании.
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.