C ++接受参数中的任何结构

时间:2013-04-09 07:46:13

标签: c++ pointers struct

我是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 ++做到这一点吗?

由于

修改

在硬件内部,我还会有另一个结构,所以我认为使用模板不合适。很抱歉迟到了。

4 个答案:

答案 0 :(得分:4)

简单地使用多态性。为所有设备创建一个基本类,并将指针或引用作为参数传递给方法doAction

编辑(感谢Koushik对elyashiv回答的评论):

实际上,一种更好的解决方案是使方法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
}