通过#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") 

谢谢!!

+0

-1只能使用由IDE插入的锅炉板宏,而不能使用编译器的预处理器 – TemplateRex

+0

为什么不使用模板? –

+3

如果这些类只会在字符串变量中有所不同,为什么会有多个类?为什么不是一个具有带字符串参数的构造函数的类? – Beta

你的宏是空的,默认情况下它不会继续到下一行,除非你最后使用了\

#define #define LANG(cName, lName) \ 
class cName \ 
{ \ 
    ... 
+0

哇...我虽然没有解决方案会很简单。非常感谢! – nevero

我很想用模板来解决你的问题 - 这真的是他们的目的。

不幸的是,坏消息是模板参数虽然可以占用大多数类型,但根本不处理char*char[]。所以:

template <char* TLang> 
class 
... 

,不幸的是,非法C++在大多数使用情况说事,看到this question及其各自的答案。

但是,您可以使用模板来实现policy based design这是现代C++设计的第一章(第二?),并在该链接描述得相当好。这个想法是你继承了不同的(模板提供的)类来实现不同的“策略”。

这实现了与您的目标相同的效果。模板是在编译时为每个实例化值生成的,所以如果我有一个类:

cName<CppPolicy> CppName; 

那么这将产生一个CppName实例,它是一类cName型的,其继承CppPolicy一些政策的能力。

如果我不得不猜测,我会说你将决定基于该字符串的值为给定语言做些什么 - 在这种情况下,基于策略的设计可能是你想要看的东西在。这样做避免了涉及串比较大if报表的额外优势。

但是,如果你真的只是在寻找字符串常量,为什么不直接使用它们,或者在评论中建议提供恒定的一个实例为每种语言?

原样,实际使用LANG两次在同一模块中会产生一个编译错误,因为你有类称为cName