gpt4 book ai didi

c++ - 具有公共(public)成员对象的类组合

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:13:03 27 4
gpt4 key购买 nike

我正在尝试找出设计我的程序功能的最佳方法。

该程序的主要组成部分是 Camera 类。这个 Camera 对象表示真实相机的程序用户界面,它通过图像采集卡连接到计算机。相机类可以链接到图像采集卡、开始和停止采集,还可以改变/访问许多不同的相机属性。当我说很多时,我指的是超过 250 个独特的命令。通过帧捕获器向物理相机发送串行字符串,向相机发出每个独特的命令。每个命令都可以被认为是三种类型之一。一个操作、一个查询和一个值。

Action 命令是不需要等号的东西,例如“重置”、“打开”、“关闭”

查询是您可以获得但不能设置的东西,它通常与一个值相关联。例如“temperature=?”、“sernum=?”、“maxframerate=?”命令会导致相机发回信息。这些值无法更改,因此“temperature=20”会导致错误。

值是您可以获取和设置的通常与值相关联的东西。例如“framerate=30”和“framerate=?”是两个独特的命令,但我认为基本字符串“framerate”是一个值命令类型,因为它既可以变异也可以访问。

250 个独特的命令可以减少到约 100 个 CameraActions、CameraQuerys 和 CameraValues。在我的 Camera 类中没有 250 个方法,我有一个想法来组合命令对象而不是单独的 setter、getter 和 Action 。命令字符串可以在构造函数中提供,或者用 setter 重置。然后我可以编写一个包含所有可用命令的 CameraCommands 对象,并将其作为公共(public)成员提供给我的相机。

//CameraAction.h =============================================
class CameraAction {
public:
CameraAction(std::string commandString, SerialInterface* serialInterface);
void operator()() { _serialInterface->sendString(_commandString); }

private:
SerialInterface* _serialInterface;
std::string _commandString;

};


//CameraValue.h =====================================================
class CameraValue {

public:

CameraValue(std::string commandString, double min, double max, SerialInterface* serialInterface);

void set(double value)
{
if(value > _maxValue) { throw std::runtime_error("value too high"); }
if(value < _minValue) { throw std::runtime_error("value too low"); }
std::string valueString = std::to_string(value);
_serialInterface->sendString(_commandString + "=" + valueString);
}

double get()
{
std::string valueString = _serialInterface->sendString(_commandString + "=?");
return atof(valueString.c_str());
}

private:

SerialInterface* _serialInterface;
std::string _commandString;
double _minValue;
double _maxValue;

};


//CameraCommands.h ===================================================
class CameraCommands {

public:
CameraCommands();
CameraAction reset;
CameraQuery temperature;
CameraValue framerate;
CameraValue sensitivity;
//... >100 more of these guys

};


//Camera.h ===========================================================
class Camera {
public:
Camera();
CameraCommands cmd;
void startAcquisition();
void stopAcquisition();
void setDataBuffer(void* buffer);
void setOtherThing(int thing);
};

这样用户就可以做类似的事情:

Camera myCamera;
myCamera.cmd.reset();
myCamera.cmd.framerate.set(30);
myCamera.cmd.sensitivity.set(95);
double temperature = myCamera.cmd.temperature.get();
myCamera.startAcquisition();

等...

这里的主要问题是我公开了公共(public)成员变量,这应该是一个巨大的禁忌。我当前的对象设计是否合乎逻辑,或者我应该简单地实现 250 个 setter 和 getter 以及 100 个以上的 setter 和 getter 来改变最小和最大可设置值。

这对我来说似乎很麻烦,因为还有许多与 Camera 对象关联的 setter/getter 与用户命令无关。用户界面最好为用户提供方法 (cmd) 的范围,以了解某些东西是在相机中发生物理变化,还是只是在编程对象(其他方法)中发生变化。有没有更好的方法来设计我的程序?

最佳答案

您基本上描述了一个有趣的层次结构:

命令 -> 查询 ->

  • Command 包含作为命令文本的字符串;它还可以提供一个 protected Send() 方法供其子级调用。
  • Query 还包含一个(protected)int 变量(或其他变量),您可以通过 get() 和/或 operator int() 立即,或 query() 来自相机;
  • Valueset() 和/或 operator =(int) 命令添加到 Query

Value 的构造函数(特别是)可以有 minmax,正如您所描述的。

Camera 对象可以有多个 public 成员:

class Camera {

private: // Classes that no-one else can have!

class Command; friend Command;
#include "Camera.Command.inc"

class Query; friend Query;
#include "Camera.Query.inc"

class Value; friend Value;
#include "Camera.Value.inc"

public: // Variables using above classes

Command reset;
Command open; // Maybe make this one private, for friends?
Command close; // Ditto?

Query temperature;
Query sernum;
Query maxFrameRate;

Value frameRate;

private: // Variables

SerialPort port; // Allow Command and co. access to this

}; // Camera

这样组织起来,那么:

  • 变量的用户不能提出不可能的请求——没有办法做到这一点;
  • query()set() 方法隐藏了与物理相机交互的机制。

您会注意到我在 Camera 类的中间添加了 #include "Camera.XXX.inc"。注意:

  1. 它不会使 Camera 类与那些子类的定义混淆 - 但 C++ 编译器在您可以使用它们之前需要它们,因此您需要将它们放在那里。如果您想知道他们做了什么,只需打开文件即可!
  2. 我给了它们 .inc 扩展名,因为它们“包含”在 .h 文件中:它们不是独立的头文件。

关于c++ - 具有公共(public)成员对象的类组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37838290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com