我是C ++的新手,我想知道我们是否可以接受任何结构作为方法参数。
情况如此:
我有一个类(让我们说hw_manager
)与硬件类交互(假设hw_device1
)。目前hw_manager
将调用hw_device1
的方法,并且将通过struct参数返回方法的结果(将struct参数作为参考发送,并更改引用参数的值)。
在C ++代码中应该是这样的:
struct sSensorStatus {
unsigned char sensor1;
unsigned char sensor2;
};
bool checkSensorStatus(struct sSensorStatus &status) {
// Change the status here
}
现在,由于硬件已更改,我需要创建一个新类,假设hw_device2
具有完全不同的操作。
struct sHardwareStatus {
unsigned char loader;
unsigned char transport;
unsigned char ejector;
unsigned char mouth;
};
bool checkHardwareStatus(struct sHardwareStatus &status) {
// Change the status here
}
我没有更改hw_manager
中的代码(这将影响此图层上方的代码),而是计划实现一个接口,假设IHardware
具有doAction
方法。
这个想法是这样的:
bool doAction(int cmdID, ????) {
// switch case cmdID
// based on the cmdID, type cast the ???? into the struct
}
我应该在 ???? 中加入什么样的结构?我可以用C ++做到这一点吗?
由于
修改
在硬件内部,我还会有另一个结构,所以我认为使用模板不合适。很抱歉迟到了。
答案 0 :(得分:4)
简单地使用多态性。为所有设备创建一个基本类,并将指针或引用作为参数传递给方法doAction
。
实际上,一种更好的解决方案是使方法doAction成为所有设备的基类中的虚拟方法,而不是将任何内容传递给它。
答案 1 :(得分:2)
你可以这样做:
struct IHardware{virtual doAction() = 0;}
现在继承
struct sHardwareStatus : public IHardware
{/*implementation with implementation for doAction()*/
unsigned char loader;
unsigned char transport;
unsigned char ejector;
unsigned char mouth;
/*provide concrete definition for bool doAction() here*/
}
也适用于
srtuct sSensorStatus : public IHardware
{/*implementation with implementation for doAction()*/
unsigned char sensor1;
unsigned char sensor2;
/*provide concrete definition for bool doAction() here*/
}
现在,当您从接口继承新硬件,然后为该类编写结构时。我猜每个硬件doAction()
会有所不同。
答案 2 :(得分:1)
如果你只需要调用一些结构和函数,你可以使用模板和模板专业化:
template<typename T>
bool doAction(T& s)
{
return false;
}
template<>
bool doAction(sSensorStatus& status)
{
return checkSensorStatus(status);
}
template<>
bool doAction(sHardwareStatus& status)
{
return checkHardwareStatus(status);
}
如您所见,您并不真正需要cmdID
标志,编译器将通过单独使用结构类型来自行解决。
答案 3 :(得分:1)
你应该使用继承。
有些事情就是这样:
struct HardwareStatusInterface{};
struct sHardwareStatus : public HardwareStatusInterface
{
unsigned char loader;
unsigned char transport;
unsigned char ejector;
unsigned char mouth;
};
struct sSensorStatus : publc HardwareStatusInterface
{
unsigned char sensor1;
unsigned char sensor2;
};
和功能:
bool doAction(int cmdID, HardwareStatusInterface &HI) {
// switch case cmdID
// based on the cmdID, type cast the ???? into the struct
}