我正在Qt 5.1 C ++中创建一个程序,它将通过一系列命令与Arduino板进行通信。这些命令最好应存储在ascii代码中,或者很容易转换为。
我希望这些命令类似于下面的伪代码,无论是初始化和声明,还是本质上类型安全
commandlist consisting of strings:
{
get = "1", //Ascii 1
set = "0"
etc
}
可以通过类似
的方式访问sendcommand(commandlist.get) etc
我知道有很多方法可以做到这一点,但哪个是最好的?一个枚举类? Qt中的一些特殊功能?命名空间,所有命令都定义为变量?
我正在考虑使用静态变量作为命令的静态类,但是当必须进行初始化时,这一切都很简洁。
答案 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使用隐式共享,因此该类的副本相对便宜。