2013-07-03 18 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方法。

    在CDeviceSetActiveRequest.cpp
  • CDeviceClientRequest :: getMessageId()在CDeviceClientRequest.cpp
  • CDeviceSetActiveRequest :: getActivFlag()
  • CDeviceTSSetActiveRequest.cpp是空的,只是包括頭。

上面的2個cpp文件和getter方法在編譯時沒有任何問題。這只是發生錯誤的第三位。

回答

1

你忘了使用公有繼承,像這樣:

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

Doh !!!!!這似乎解決了這個問題。 –

+0

清理編譯,謝謝: –

0

的問題是,你私下繼承你的類,所以中產階級隱藏了枚舉。

你可能想在這裏公開繼承:class CDeviceSetActiveRequest : public CDeviceClientRequestclass CDeviceTSSetActiveRequest : public CDeviceSetActiveRequest(注意我在那裏添加了public一詞)。