2

我正在从一些主要与 USB 串行通信有关的简单 C 函数创建一些 C++ 库。我正在用 Visual Studio 2010 编写它,目的是移植到 mac 和 linux。

我目前有一个 SerialCommunication 类和一个 PumpComm 子类。目前,有一个 C 函数用于 CreateMessage(uint8 msg[])、SendMessage(uint8 msg[])、ReadSerial(uint8 readmsg[]) 等。

我的问题是:将 msg[] 更改为成员变量而不是函数参数有什么缺点吗?(伪代码):

int main() 
{
    SerialPort sp;
    sp.OpenSerial("COM19");
    sp.CreateMessage("Messagetosend1234");
    sp.SendMsg();
}

class SerialPort 
{
private:
    uint8 msg[];

public:
    int32 OpenSerial();
    int32 CreateMessage(uint8 msg[]);

}

我看到的优点包括:1)msg显然由它将发送到的串口拥有,2)msg的范围是串口的范围,3)msg的实现可以隐藏(当我添加了getter/setter)..所以基本上是OOP的优势。我对 c++ 和 OOP 还很陌生,所以我可能会遗漏一些东西,尤其是在串行通信方面。谢谢你的时间。

4

1 回答 1

2

消息是 COM 通道的一部分吗?我会说你通过频道发送消息。您的设计将“如何”(渠道)与“什么”(消息)紧密结合。此外,您在代码中隐式添加了许多状态依赖项——例如,您必须在调用 SendMsg 之前调用 CreateMessage。

总而言之,有些事情可能会适得其反:

  • 如果您需要从多个线程访问通道
  • 如果您的消息超过一个字节缓冲区
  • 如果您重构代码并错误地交换了一些调用

因此,我会保留消息和通道两个单独的类:

class Message {
private:
  uint8 *buffer;
  size_t length;

public:
  Message(uint8 *buf, size_t len) : buffer(buf), length(len) { }

  size_t getLength() const { return length; }
  const uint8 *getData() const { return buffer; }
};

class SerialPort 
{
public:
    int32 OpenSerial();
    int32 SendMsg(const Message& msg);

}
于 2013-01-16T19:52:31.353 回答