我继承了一些我必须完成的 10 年前的代码。代码在 MFC (C++) 中。
有一个 .h 文件,其中写入了自定义数据结构,并且其中包含一些常量变量作为全局变量。其中一些用于 CString 类型的 MS Office 文件扩展名,并声明为 _T(".doc")、_T(".xls") 等。
显然,这些已过时,需要更新以识别 Office 2007 和更高版本的扩展。我的第一个绝妙想法是在需要时使用 const_cast 来更改常量,但后来发现这是不行的,并导致未定义的行为(有时它会切换回 .doc)。
然后我决定创建一个结构并从中继承两个结构。我在基本结构中创建了一个 void 方法以使其抽象化,但除此之外它什么都不做。这是代码:
struct eOfficeExtensions{
const CString WORD_EXTENSION;
const CString EXCEL_EXTENSION;
const CString WORDPAD_EXTENSION;
const INT EXTENSION2007;
eOfficeExtensions(CString word, CString excel, CString wordpad, INT ver) :
WORD_EXTENSION(word), EXCEL_EXTENSION(excel), WORDPAD_EXTENSION(wordpad), EXTENSION2007(ver){}
//method to ensure base class is abstract
virtual void Interface() = 0;
};
struct eOfficeExtensions2003 : public eOfficeExtensions{
public:
eOfficeExtensions2003() : eOfficeExtensions(_T(".doc"), _T(".xls"), _T(".rtf"), 0){}
private:
virtual void Interface(){}
};
struct eOfficeExtensions2007OrLater : public eOfficeExtensions{
eOfficeExtensions2007OrLater() : eOfficeExtensions(_T(".docx"), _T(".xlsx"), _T(".rtf"), 1){}
private:
virtual void Interface(){}
};
对于应该是一个简单的条件定义的代码,这感觉像是荒谬的代码。有经验的程序员会做什么?
编辑
这些常量应该只设置一次并且永远不会改变。安装的 MS Office 版本是通过扫描处理内存管理的类中的注册表子项来确定的。
常量主要用于创建新文件或在目录中搜索具有该扩展名的文件,而不是用于解析条件语句。该结构还应作为指向相关子结构的 eOfficeExtensions* 指针实例化一次。
最佳答案
您的继承树本质上为基本结构定义了两个不同的值。
您不需要继承来定义这些值,您只需要两个变量:
struct eOfficeExtensions{
const CString WORD_EXTENSION;
const CString EXCEL_EXTENSION;
const CString WORDPAD_EXTENSION;
const INT EXTENSION2007;
};
const eOfficeExtensions extensions2003{_T(".doc"), _T(".xls"), _T(".rtf"), 0};
const eOfficeExtensions extensions2007{_T(".docx"), _T(".xlsx"), _T(".rtf"), 1};
const eOfficeExtensions* extensions = 0;
// ... Later ...
if (office2007Installed)
extensions = &extensions2007;
else
extensions = &extensions2003;
关于c++ - C++ 中的变量全局常量 "macros"和最佳设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30735478/