如何声明只能在特定上下文中使用的数据结构,c++

How to declare structures of data that should only be used in a certain context, C++

本文关键字:上下文 c++ 数据结构 何声明 声明      更新时间:2023-10-16

我有一个相当普遍的设计问题,想很好地解决它。我在一个嵌入式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;
};

但是我认为这样我允许用户创建自己的RCInput类型的结构也与remoteccontrol无关,所以我在寻找一个更好的设计。但也许根本就没有。

看起来RCInput只是一个数据,所以你可以这样布局:

RCInput.h file

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 file:

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;

最好从第一天开始上课。

如果担心性能问题,可以内联getter。

如果你想在容器中存储RCInput,添加一个公共的默认构造函数。

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