c++ - C++ 中的变量全局常量 "macros"和最佳设计模式

标签 c++ design-patterns mfc constants global

我继承了一些我必须完成的 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/

相关文章:

c++ - window编程中如何与dropbox联动

c++ - 在源文件中定义数组并在其他源文件中使用它

c++ - lua_getglobal 崩溃程序

php - 相同的算法,不同的结果

java - 什么样的类/对象使用有关多个对象的信息来表示更大的系统?

c - 警告 LNK4092 : shared writable section contains relocations

c++ - 解析 Clang AST - 缩进级别和起始符号

.net - 如何在几秒钟内使用 ReSharper 创建方法参数对象?

mysql - 并行运行处理器时,我应该如何选择下一个要处理的项目?

c++ - MFC - 打印 - 从自定义页面设置对话框更改页面方向