通过#define宏创建自定义类
我正在尝试使用#define创建一个宏,该宏允许我根据需要创建新类。这里是我的代码:通过#define宏创建自定义类
#pragma once
#include "PDDefFileReader.h"
#define SET_LANG(lang) *(new std::string(lang))
#define LANG(cName, lName)
class cName
{
public:
cName()
{
_langName = SET_LANG(lName); <- HERE !!!!
_reader = new PDDefFileReader(_langName);
}
~cName(){}
std::string Str(){ return _langName; }
private:
PDDefFileReader* _reader;
std::string _langName;
};
所以我想知道我应该怎么做,如果我想的定义“L-NAME”参数被视为一个std :: string对象。现在(在该行“在这里!!!!”)我得到的错误:
Error: Identifier "lName" is undefined
,如果我想要做的是能知道吗?
为了给你一些上下文,我正在做一个自定义的多语言阅读器。所以我可以简单地定义一种新语言:
LANG(Cpp, "cpp")
LANG(Perl, "pl")
谢谢!!
你的宏是空的,默认情况下它不会继续到下一行,除非你最后使用了\
,
#define #define LANG(cName, lName) \
class cName \
{ \
...
哇...我虽然没有解决方案会很简单。非常感谢! – nevero
我很想用模板来解决你的问题 - 这真的是他们的目的。
不幸的是,坏消息是模板参数虽然可以占用大多数类型,但根本不处理char*
或char[]
。所以:
template <char* TLang>
class
...
,不幸的是,非法C++在大多数使用情况说事,看到this question及其各自的答案。
但是,您可以使用模板来实现policy based design这是现代C++设计的第一章(第二?),并在该链接描述得相当好。这个想法是你继承了不同的(模板提供的)类来实现不同的“策略”。
这实现了与您的目标相同的效果。模板是在编译时为每个实例化值生成的,所以如果我有一个类:
cName<CppPolicy> CppName;
那么这将产生一个CppName
实例,它是一类cName
型的,其继承CppPolicy
一些政策的能力。
如果我不得不猜测,我会说你将决定基于该字符串的值为给定语言做些什么 - 在这种情况下,基于策略的设计可能是你想要看的东西在。这样做避免了涉及串比较大if
报表的额外优势。
但是,如果你真的只是在寻找字符串常量,为什么不直接使用它们,或者在评论中建议提供恒定的一个实例为每种语言?
原样,实际使用LANG
两次在同一模块中会产生一个编译错误,因为你有类称为cName
。
-1只能使用由IDE插入的锅炉板宏,而不能使用编译器的预处理器 – TemplateRex
为什么不使用模板? –
如果这些类只会在字符串变量中有所不同,为什么会有多个类?为什么不是一个具有带字符串参数的构造函数的类? – Beta