寻求一个不太笨拙的答案,以同步枚举名称列表与相应的文本

问题描述 投票:0回答:1

我将定义类:

class FAULT { public: FAULT(); ~FAULT(); const char* GetString(int nFault); private: const char* cList[5] = { "Text describing OK", "Text describing Bad", "Text describing Worse", "Text describing Fubar", "Text describing Obliterated", }; };

代码:

FAULT::FAULT() { } FAULT::~FAULT() { } const char* FAULT::GetString(int nFault) { return cList[nFault]; }

main代码:

int main() { FAULT fault; const char* pText; pText = fault.GetString(OK); pText = fault.GetString(BAD); pText = fault.GetString(WORSE); pText = fault.GetString(FUBAR); pText = fault.GetString(OBLITERATED); return 0; }

我的问题是关于文本和枚举之间的同步。这对我来说很笨拙,因为有两个很长的清单。是否有更好的方式可以将定义组合在一起而不是两个列表? 这里的代码有效,但很笨拙,您能帮我找到一个更好的答案吗?
	

通常的解决方案是自动代码生成:您有一个带有标识符和描述的数据文件,以及将其转换为程序中所需的代码段的程序。 有专门的工具可以做到这一点,但是,正如Eljay评论的那样,您可以通过使用XMacros.

,使预处理器成为代码生成器。
C++在消除对预处理器的需求方面取得了很大进步,但仍然没有很好的替代品。
如果您想将X宏应用于您的案件,那将是这样工作的:

首先,创建一个带有枚举名称和文本描述的标题文件:

c++
1个回答
0
投票

next,在哪里定义枚举,您会写下:

enum FaultNumber { #define X(NAME, TEXT) NAME, #include "faults.h" #undef X };

在定义消息表的位置,您将执行此操作:

const char* cList[] = { #define X(NAME, TEXT) TEXT, #include "faults.h" #undef X };

注意,我从阵列大小中删除了5个。  让初始化器的数量确定条目的数量意味着将来添加或删除故障时不必更改该常数。
当您确实要添加或删除故障或更改现有姓名或描述时,您会更改故障。h和重新编译。

注意Clist是一个成员变量:您可能希望它是静态的,因此只有一个副本。 您可能还需要将其声明为constexpr,以便可以在类定义中初始化它,而不是在实现文件中分别定义它。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.