我有一个比较普通的设计问题,想很好地解决它。我正在嵌入式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/