У меня есть следующий базовый класс определен:Как передать перечисление на базовый класс, конструктор подкласса
class CDeviceClientRequest
{
public:
/** Enumeration for the client message identifier. */
enum EClientMessageIdentifier
{
TS_SET_ACTIVE, // Set Active request for Total Station device.
GPS_SET_ACTIVE, // Set Active request for GPS device.
TS_SET_COM_PORT, // Set COM Port request for Total Station device.
GPS_SET_COM_PORT, // Set COM Port request for GPS device.
TS_GET_OBSERVATION, // Get Observation request for Total Station device.
GPS_GET_POSITION, // Get Position request for GPS device.
GPS_GET_QUALITY // Get Quality request for GPS device.
}; // EClientMessageIdentifier
/**
* Getter method for the client message identifier.
*/
EClientMessageIdentifier getMessageId();
protected:
/**
* Protected constructor.
*
* @param messageId
* The enumeration representing the request message identifier.
*/
CDeviceClientRequest(EClientMessageIdentifier messageId)
: m_iMessageId(messageId) {}
private:
/** The enumeration representing the request message identifier. */
EClientMessageIdentifier m_iMessageId;
}; // CDeviceClientRequest
Это имеет следующий подкласс:
class CDeviceSetActiveRequest : CDeviceClientRequest
{
public:
/**
* Getter method for the activation flag.
*/
bool getActiveFlag();
protected:
/**
* Protected constructor.
*
* @param messageId
* The enumeration representing the request message identifier.
* @param setActive
* The flag for the activation request.
*/
CDeviceSetActiveRequest(EClientMessageIdentifier messageId,
bool setActive)
: CDeviceClientRequest(messageId),
m_bActive(setActive) {}
private:
/** Flag for the activation request. */
bool m_bActive;
}; // CDeviceSetActiveRequest
Который также имеет следующий инстанциируемый суб-класс:
class CDeviceTSSetActiveRequest : CDeviceSetActiveRequest
{
public:
/**
* Public constructor.
*
* @param setActive
* The flag for the activation request.
*/
CDeviceTSSetActiveRequest(bool setActive)
: CDeviceSetActiveRequest(CDeviceClientRequest::TS_SET_ACTIVE,
setActive) {}
}; // CDeviceTSSetActiveRequest
Так вы создаете объект типа CDeviceTSSetActiveRequest, проходящий в логический параметр. Он вызывает конструктор CDeviceSetActiveRequest суперкласса, передавая значение перечисления для типа запроса. Он, наконец, вызывает параметр CDeviceClientRequest, указывающий значение перечисления в переменной частного члена.
Однако код отказывается компилироваться дает следующее сообщение об ошибке:
camd011> make
g++ -c CDeviceTSSetActiveRequest.cpp \
-I.. -o bin/CDeviceTSSetActiveRequest.o
In file included from CDeviceTSSetActiveRequest.cpp:13:0:
CDeviceClientRequest.h: In constructor 'device::request::CDeviceTSSetActiveRequest::CDeviceTSSetActiveRequest(bool)':
CDeviceClientRequest.h:30:1: error: 'class device::request::CDeviceClientRequest device::request::CDeviceClientRequest::CDeviceClientRequest' is inaccessible
CDeviceTSSetActiveRequest.h:37:34: error: within this context
make: *** [bin/CDeviceTSSetActiveRequest.o] Error 1
Может кто-нибудь помочь? Как я могу использовать перечисление, определенное в моем основном базовом слое, в поддающемся подклассу?
Забыл добавить: версии файлов cpp реализуют методы getter.
- CDeviceClientRequest :: getMessageId() в CDeviceClientRequest.cpp
- CDeviceSetActiveRequest :: getActivFlag() в CDeviceSetActiveRequest.cpp
- CDeviceTSSetActiveRequest.cpp пуст и включает в себя только заголовок.
Вышеуказанные 2 файла cpp, с помощью методов getter, скомпилируйте без проблем. Это только третья ошибка.
Doh !!!!! Это, похоже, устранило проблему. –
Чистая компиляция, спасибо: –