在C ++中组织命令的最好方法

时间:2013-11-29 17:35:06

标签: c++ qt

我正在Qt 5.1 C ++中创建一个程序,它将通过一系列命令与Arduino板进行通信。这些命令最好应存储在ascii代码中,或者很容易转换为。

我希望这些命令类似于下面的伪代码,无论是初始化和声明,还是本质上类型安全

commandlist consisting of strings:
{
   get = "1",  //Ascii 1
   set = "0"
etc
}

可以通过类似

的方式访问
sendcommand(commandlist.get) etc

我知道有很多方法可以做到这一点,但哪个是最好的?一个枚举类? Qt中的一些特殊功能?命名空间,所有命令都定义为变量?

我正在考虑使用静态变量作为命令的静态类,但是当必须进行初始化时,这一切都很简洁。

2 个答案:

答案 0 :(得分:3)

使用strongly-typed enum和字符串数组(或向量):

#include <vector>
#include <string>
enum class CommandType
{
  Get = 0,
  Set,       // this will be set to 1, etc...
  ...
};

// ...

const std::vector<std::string> commandNames = {"get", "set", ...};

// ...

CommandType cmd = CommandType::Get;
auto commandName = commandNames[static_cast<int>(cmd)];
// use commandName here

答案 1 :(得分:1)

或类似的东西:

class Command {
public:
    Command (QByteArray const& ascii) :ascii_(ascii) {}
    QByteArray ascii_;
};

static const Command cmd_get("1");
static const Command cmd_set("0");

sendCommand(cmd_get);
sendCommand(cmd_set);

如果您不打算使用动态命令文本,则可以使用const char*

编辑实际上,将这些作为静态类成员可能会更好:

class Command {
public:
    static const Command GET;
    static const Command SET;

    explicit Command (QByteArray const& ascii) :ascii_(ascii) {}
    QByteArray const& getAscii() const { return ascii_; }

private:
    QByteArray ascii_;
};

// Implementation
const Command Command::GET("1");
const Command Command::SET("0");

sendCommand(Command::GET);
sendCommand(Command::SET);

此外,由于QByteArray使用隐式共享,因此该类的副本相对便宜。