如何将基类上的枚举传递给子类的构造函数
How do I pass an enumeration on a base class, to the constructor of a subclass
我定义了以下基类:
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 CDeviceClientRequest
和class CDeviceTSSetActiveRequest : public CDeviceSetActiveRequest
(注意,我在其中添加了单词public)。
相关文章:
- 在类构造函数中传递对外部函数的引用
- 具有enable_if外部类原型的模板类构造函数定义
- 自动重复 extern "C"函数中的类构造函数采用的相同参数
- 模板化类构造函数的模板实例化
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 重写子类构造函数中的父类变量
- 我可以从我的超类调用子类构造函数吗?
- 使用基类构造函数的子类构造函数的大纲定义
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- 是否有必要调用父构造函数而不使用子类构造函数的参数?
- Singleton子类构造函数错误
- C++ 在超类构造函数中运行依赖于子类覆盖的大量变量的代码的正确方法是什么?
- 指向子类构造函数中接口类函数的函数指针
- 编写子类构造函数的实现
- C++在子类内部调用基类构造函数
- 子类构造函数
- 子类调用超类构造函数
- 使用私有成员的子类构造函数
- 子类调用基类构造函数,然后使用子类Arduino c++中基类的实例方法
- 继承父类构造函数的c++子类