如何将基类上的枚举传递给子类的构造函数

How do I pass an enumeration on a base class, to the constructor of a subclass

本文关键字:子类 构造函数 枚举 基类      更新时间:2023-10-16

我定义了以下基类:

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中的CDeviceClient请求::getMessageId()
  • CDeviceSetActiveRequest.cpp中的CDeviceSetActiveRequest::getActivFlag()
  • CDeviceTSSetActiveRequest.cpp为空,仅包含标头

上面的两个cpp文件使用getter方法,编译起来没有任何问题。这只是发生错误的第三个地方。

您忘记使用公共继承,如下所示:

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

问题是您私下继承了您的类,所以中间类隐藏了枚举。

您可能想要这里的公共继承:class CDeviceSetActiveRequest : public CDeviceClientRequestclass CDeviceTSSetActiveRequest : public CDeviceSetActiveRequest(注意,我在其中添加了单词public)。