如何声明只能在特定上下文中使用的数据结构,c++
How to declare structures of data that should only be used in a certain context, C++
我有一个相当普遍的设计问题,想很好地解决它。我在一个嵌入式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
,则将构造函数设为私有并将创建类声明为友类(但这使得将其存储在容器中变得困难)。
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 错误"Could not find Boost"(缺少:上下文标头)
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 安排带有上下文的协同程序
- 我的文件无法正常工作,无法从C++文件中读取上下文
- DCMTK 了解"DIMSE 没有有效的演示上下文 ID"错误
- 具有std::initializer_list参数的非成员函数(/non构造函数上下文)的重载解析
- antlr 规则上下文是否可以独立于目标
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 为什么 Perf 具有如此高的上下文切换?
- 非推导上下文,如标准库中的"boost::mpl::identity:<T>:type"?
- 使用 std::size 来自非 const 上下文
- 如何使用IExecuteCommand和动词在上下文菜单外壳扩展中显示本地化文本和自定义图标?