我有一个比较普通的设计问题,想很好地解决它。我正在嵌入式C ++项目中编写远程控制驱动程序。将有两种类型的遥控器:操纵杆或收音机。正如我希望实际的遥控器过去对于用户程序员而言是透明的,我还为这两者提供了一个基类。因此,我将拥有:

class RemoteControl {};
class JoystickControl : public RemoteControl {};
class RadioControl : public RemoteControl {};


我希望RemoteContol仅具有一个公共方法:RemoteControl.getInput()。此方法应返回通用格式的数据结构,例如。 RCInput,因此上述方法的声明为:

class RemoteContol {
    virtual RCInput getInput();
};


现在,实现RCInput并将其传递给其他类的对象的最佳方法是什么?
我以为内部类/结构可能是一种解决方案,但我从未使用过,所以有人可以提供实现和用法的示例吗?

提前致谢。

编辑:
我之前做过的事情(可以作为参考,目前不重要):

typedef struct {
    int a;
    int b;
} RCInput;

class RemoteContol {
public:
    virtual RCInput getInput() { return rcInput; }

private:
    RCInput rcInput;
};


但是我想过这种方式允许用户创建自己的与RC无关的RCInput类型的结构,因此我一直在寻找更好的设计。但是也许没有。

最佳答案

看来RCInput只能是数据,因此可以这样布置:

RCInput.h文件

class RCInput
{
public:

    RCInput(double x, double y, double z);
    double x() const;
    double y() const;
    double z() const;
private:
    double m_x;
    double m_y;
    double m_z;
};


RCInput.cpp文件:

RCInput::RCInput(double x, double y, double z)
: m_x(x), m_y(y), m_z(z)
{
}

double RCInput::x() const
{
    return m_x;
}

double RCInput::y() const
{
    return m_y;
}

double RCInput::z() const
{
    return m_z;
}


不要使其成为嵌套类,而应将其放在自己的头文件中。这样,使用输入的客户端实际上就不依赖于RemoteControl类头文件。以我的经验,嵌套类通常是不必要的复杂性,除非真正必要(例如容器中的迭代器),否则应最好避免使用它们。

另外,不要屈从于使RCInput成为具有公共数据的结构的诱惑。如果这样做,您将失去对数据访问和数据创建的所有控制权(在getter中没有访问日志记录,在构造函数中没有数据验证,在任何地方都没有设置调试器断点的位置)。请记住,向前声明一个类/结构意味着如果您以后决定将struct转换为class(即代替

struct RCInput;

你将不得不写

class RCInput;

最好从第一天开始上课。

如果您担心性能,可以内联吸气剂。

如果要将RCInput存储在容器中,请添加公共默认构造函数。

如果要控制谁可以创建RCInput,则将构造函数设为私有并将创建类声明为好友(但这会使将其存储在容器中变得困难)。

关于c++ - 如何声明仅应在特定上下文中使用的数据结构,C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7570165/

10-11 16:29