Hi i have the following problem in my design ::::
i want to define an abstract class LogBuffer and derive two singleton
classes from it i.e
AlarmBuffer and FireWallBuffer. For this my design is such that i have
to define data members in class LogBuffer.i.e
*************** *************** *************** *************** *************** *********
class LogBuffer
{
private:
int _pStart;
int _pEnd;
int _pCur;
protected:
char * _pCurBuffer;
public:
LogBuffer():_pS tart(0),_pCur(0 ),_pCurBuffer(0 ){}
virtual void LogAlarm(char*) =0;
virtual void ReadLog()=0;
void LogBuffer_LogAl arm(char * pLogAlarm)
{
printf("\nIn Log Alarm \n");
memcpy((void*)( &_pCurBuffer[_pCur]),(void*)pLogAl arm,strlen(pLog Alarm));
_pCur+=strlen(p LogAlarm);
}
void LogBuffer_ReadL og()
{
printf("\nIn Read Alarm\n");
printf("\nThe logs are \n %s\ncur:%d",(&_ pCurBuffer[_pStart]),_pCur);
}
};
class FireWallBuffer: public LogBuffer
{
private:
char _aFireWallBuf[1000];
static FireWallBuffer *_pSingletonFir eWallBuffer;
public:
FireWallBuffer( )
{
printf("\nIn FIreWall Constructor\n") ;
for(int i=0;i<1000;i++)
_aFireWallBuf[i]=' ';
}
void LogAlarm(char*p Alarm)
{
_pCurBuffer=_aF ireWallBuf;
LogBuffer_LogAl arm(pAlarm);
}
void ReadLog()
{
_pCurBuffer=_aF ireWallBuf;
LogBuffer_ReadL og();
}
static FireWallBuffer * instance()
{
if(_pSingletonF ireWallBuffer!= NULL)
return _pSingletonFire WallBuffer;
else
{
_pSingletonFire WallBuffer=new FireWallBuffer;
return _pSingletonFire WallBuffer ;
}
}
};
FireWallBuffer * FireWallBuffer: :_pSingletonFir eWallBuffer=NUL L;
class AlarmBuffer:pub lic LogBuffer
{
private:
static AlarmBuffer *_pSingletonAla rmBuffer;
char _aAlarmBuf[1000];
public:
AlarmBuffer()
{
printf("\nIn Alarm Constructor\n") ;
for(int i=0;i<1000;i++)
_aAlarmBuf[i]=' ';
}
void LogAlarm(char*p Alarm)
{
_pCurBuffer=_aA larmBuf;
LogBuffer_LogAl arm(pAlarm);
}
void ReadLog()
{
_pCurBuffer=_aA larmBuf;
LogBuffer_ReadL og();
}
static AlarmBuffer * instance()
{
if(_pSingletonA larmBuffer!=NUL L)
return _pSingletonAlar mBuffer;
else
{
_pSingletonAlar mBuffer=new AlarmBuffer;
return _pSingletonAlar mBuffer ;
}
}
};
AlarmBuffer * AlarmBuffer::_p SingletonAlarmB uffer=NULL;
*************** *************** *************** *************** *************** *************** ***
The above piece of code is compiling but here is the design issue i am
concerned of.
An abstract class should only declare the interfaces which the child
classes define.
Is it ok to define data members in an abstract class and use them . I
mean is it a logical
mistake or fine.Because an abstract class cannot be instantiated .So
having data members
in it makes sense from c++ point of view or not ????
regards,
ankit jain
i want to define an abstract class LogBuffer and derive two singleton
classes from it i.e
AlarmBuffer and FireWallBuffer. For this my design is such that i have
to define data members in class LogBuffer.i.e
*************** *************** *************** *************** *************** *********
class LogBuffer
{
private:
int _pStart;
int _pEnd;
int _pCur;
protected:
char * _pCurBuffer;
public:
LogBuffer():_pS tart(0),_pCur(0 ),_pCurBuffer(0 ){}
virtual void LogAlarm(char*) =0;
virtual void ReadLog()=0;
void LogBuffer_LogAl arm(char * pLogAlarm)
{
printf("\nIn Log Alarm \n");
memcpy((void*)( &_pCurBuffer[_pCur]),(void*)pLogAl arm,strlen(pLog Alarm));
_pCur+=strlen(p LogAlarm);
}
void LogBuffer_ReadL og()
{
printf("\nIn Read Alarm\n");
printf("\nThe logs are \n %s\ncur:%d",(&_ pCurBuffer[_pStart]),_pCur);
}
};
class FireWallBuffer: public LogBuffer
{
private:
char _aFireWallBuf[1000];
static FireWallBuffer *_pSingletonFir eWallBuffer;
public:
FireWallBuffer( )
{
printf("\nIn FIreWall Constructor\n") ;
for(int i=0;i<1000;i++)
_aFireWallBuf[i]=' ';
}
void LogAlarm(char*p Alarm)
{
_pCurBuffer=_aF ireWallBuf;
LogBuffer_LogAl arm(pAlarm);
}
void ReadLog()
{
_pCurBuffer=_aF ireWallBuf;
LogBuffer_ReadL og();
}
static FireWallBuffer * instance()
{
if(_pSingletonF ireWallBuffer!= NULL)
return _pSingletonFire WallBuffer;
else
{
_pSingletonFire WallBuffer=new FireWallBuffer;
return _pSingletonFire WallBuffer ;
}
}
};
FireWallBuffer * FireWallBuffer: :_pSingletonFir eWallBuffer=NUL L;
class AlarmBuffer:pub lic LogBuffer
{
private:
static AlarmBuffer *_pSingletonAla rmBuffer;
char _aAlarmBuf[1000];
public:
AlarmBuffer()
{
printf("\nIn Alarm Constructor\n") ;
for(int i=0;i<1000;i++)
_aAlarmBuf[i]=' ';
}
void LogAlarm(char*p Alarm)
{
_pCurBuffer=_aA larmBuf;
LogBuffer_LogAl arm(pAlarm);
}
void ReadLog()
{
_pCurBuffer=_aA larmBuf;
LogBuffer_ReadL og();
}
static AlarmBuffer * instance()
{
if(_pSingletonA larmBuffer!=NUL L)
return _pSingletonAlar mBuffer;
else
{
_pSingletonAlar mBuffer=new AlarmBuffer;
return _pSingletonAlar mBuffer ;
}
}
};
AlarmBuffer * AlarmBuffer::_p SingletonAlarmB uffer=NULL;
*************** *************** *************** *************** *************** *************** ***
The above piece of code is compiling but here is the design issue i am
concerned of.
An abstract class should only declare the interfaces which the child
classes define.
Is it ok to define data members in an abstract class and use them . I
mean is it a logical
mistake or fine.Because an abstract class cannot be instantiated .So
having data members
in it makes sense from c++ point of view or not ????
regards,
ankit jain
Comment