Как переключать реализацию класса через #define?
От: V488  
Дата: 11.04.07 09:51
Оценка:
Как на этапе компиляции определять реализвцию компонета Store?
(пишу под DOS)

//Device.h ========================
#define FSTOR //переключатель
//#define RAMSTOR
//////////////////////////////////

//Archiv.h=========================
#include "Device.h"
class Archiv
{
//подключаем соответствующий класс носителя
#ifdef RAMSTOR
#include "RamStor.h"
RamStor Store;
#endif
#ifdef RAMSTOR
#include "FStor.h"
FStor Store;
#endif

int Open(char);
};

//Archiv.cpp======================
#include "Archiv.h"
#include "Device.h"
int Archiv::Open(char mode)
{
IsOpen=Store.Open(mode); ERROR: `Store' undeclared (first use this function)
return IsOpen;
}
//////////////////////////////////

//Main===========================
#include "Archiv.h"
Archiv Arch;
int main(int argc, char** argv)
{
Arch.Archiving(ArchData, LenArchData);
}
Re: Как переключать реализацию класса через #define?
От: Alco  
Дата: 11.04.07 10:06
Оценка:
Наверное где-то должен быть #ifdef FSTOR?

V>//Archiv.h=========================

V>#include "Device.h"
V>class Archiv
V>{
V> //подключаем соответствующий класс носителя
V> #ifdef RAMSTOR
V> #include "RamStor.h"
V> RamStor Store;
V> #endif
V> #ifdef RAMSTOR //<-- наверное здесь
V> #include "FStor.h"
V> FStor Store;
V> #endif

V> int Open(char);

V>};
И еще, не лучше ли использовать наследование и полиморфизм?
Re: Как переключать реализацию класса через #define?
От: Hawk Россия  
Дата: 11.04.07 10:07
Оценка:
Здравствуйте, V488, Вы писали:

V>//Archiv.h=========================
V>#include "Device.h"
V>class Archiv
V>{
V>      //подключаем соответствующий класс носителя        
V>    #ifdef RAMSTOR
V>            #include "RamStor.h"
V>        RamStor Store;                        
V>    #endif
V>    #ifdef RAMSTOR -> FSTOR
V>           #include "FStor.h"
V>        FStor Store;                        
V>    #endif

V>      int Open(char);
V>};


Очепятка?
Re[2]: Как переключать реализацию класса через #define?
От: V488  
Дата: 11.04.07 10:24
Оценка:
H>Очепятка?
Да точно, конечно так:
//подключаем соответствующий класс носителя
V>> #ifdef RAMSTOR
V>> #include "RamStor.h"
V>> RamStor Store;
V>> #endif
V>> #ifdef FSTOR
V>> #include "FStor.h"
V>> FStor Store;
V>> #endif
Просто я подозреваю когда компилится cpp, h еще не прочитан
Re: Как переключать реализацию класса через #define?
От: Кодт Россия  
Дата: 11.04.07 13:46
Оценка:
Здравствуйте, V488, Вы писали:

V>Как на этапе компиляции определять реализвцию компонета Store?


Верной дорогой идёте, товарищи, к нарушению ODR!
Условная компиляция — это крайняя мера, и управляться она должна дефайнами в свойствах проекта. В противном случае есть риск скомпилировать два .cpp файла с разными дефайнами...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Как переключать реализацию класса через #define?
От: Chorkov Россия  
Дата: 12.04.07 06:16
Оценка:
Здравствуйте, V488, Вы писали:

V>Как на этапе компиляции определять реализвцию компонета Store?

...

Подозреваю, что проблема в содержимом "RamStor.h"/"FStor.h" которое включается внутрь определения класса.
Попробуй примерно так:

//Archiv.h=========================
#include "Device.h"

#ifdef RAMSTOR
#include "RamStor.h"
typedef RamStor UsedStor;
#endif
#ifdef FSTOR
#include "FStor.h"
typedef FStor UsedStor;
#endif

class Archiv
{
//подключаем соответствующий класс носителя
    UsedStor Store;
    int Open(char);
};


Это вероятно избавит от ошибки не, как как заметил Кодт -это путь к ошибкам, связанным с ODR.

Более устойчивый к ошибкам вариант:


//Device.h ========================

#include "RamStor.h"
#include "FStor.h"

//// Переключатель:
//typedef RamStor UsedStor;
typedef FStor UsedStor;

//Archiv.h=========================
#include "Device.h"

template<class XStor=UsedStor>
class Archiv
{
//подключаем соответствующий класс носителя
    XStor Store;
    int Open(char);
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.