gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:52:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com