2013-07-03 2 views
0

У меня есть следующий базовый класс определен:Как передать перечисление на базовый класс, конструктор подкласса

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, скомпилируйте без проблем. Это только третья ошибка.

ответ

1

Вы забыли использовать открытое наследование, например:

class CDeviceSetActiveRequest : public CDeviceClientRequest 
/* ... */ 
class CDeviceTSSetActiveRequest : public CDeviceSetActiveRequest 
+0

Doh !!!!! Это, похоже, устранило проблему. –

+0

Чистая компиляция, спасибо: –

0

Проблема заключается в том, что вы в частном порядке наследования классы, так что средний класс прячется перечисление.

Возможно, вы захотите публичного наследования здесь: class CDeviceSetActiveRequest : public CDeviceClientRequest и class CDeviceTSSetActiveRequest : public CDeviceSetActiveRequest (уведомление я добавил здесь слово public).

Смежные вопросы