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.cpp の CDeviceClientRequest::getMessageId()
  • CDeviceSetActiveRequest.cpp 内の CDeviceSetActiveRequest::getActivFlag()
  • CDeviceTSSetActiveRequest.cpp は空で、ヘッダーだけが含まれています。

getter メソッドを使用した上記の 2 つの cpp ファイルは、問題なくコンパイルされます。エラーが発生するのは 3 番目だけです。

4

2 に答える 2

0

問題は、クラスを個人的に継承しているため、中間クラスが列挙を隠していることです。

おそらく、ここでは public 継承が必要です: class CDeviceSetActiveRequest : public CDeviceClientRequestand class CDeviceTSSetActiveRequest : public CDeviceSetActiveRequest(そこに public という単語を追加したことに注意してください)。

于 2013-07-03T17:16:08.447 に答える