C++ 通过#define宏创建自定义类

C++ 通过#define宏创建自定义类,c++,programming-languages,C++,Programming Languages,我正在尝试创建一个带有#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 );

我正在尝试创建一个带有#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;
};
知道我想做什么是可能的吗

为了给你一些背景知识,我正在做一个定制的多语言阅读器。因此,我可以简单地通过以下操作定义新语言:

LANG( Cpp, "cpp" )
LANG( Perl, "pl" )

谢谢

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

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

我很想用模板来解决你的问题——这才是它们真正的目的

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

template <char* TLang>
class
...
模板
班
...
不幸的是,在大多数用例中,非法的C++是重要的,参见和它的相应答案。

但是,您可以使用模板来实现现代C++设计的第一章(第二章),并且在该链接中描述得相当好。其思想是继承不同的(模板提供的)类来实现不同的“策略”

这将达到与您的目标相同的效果。模板是在编译时为每个实例化的值生成的,因此如果我有一个类:

cName<CppPolicy> CppName;
cName-CppName;
然后,这将生成一个
CppName
实例,该实例是一个
cName
类型的类,它从
CppPolicy
继承了一些策略功能

如果让我猜的话,我会说您将要根据字符串的值来决定对给定语言做什么-在这种情况下,基于策略的设计可能是您想要了解的内容。这样做的另一个优点是避免了涉及字符串比较的大型
if
语句

但是,如果您实际上只是在寻找字符串常量,为什么不简单地使用它们,或者按照注释中的建议,为每种语言的实例提供常量呢


实际上,在同一个模块中两次使用
LANG
会产生编译错误,因为有两个名为
cName

-1的类只使用IDE插入的锅炉板宏,不是由编译器的预处理器实现的为什么不为此使用模板?如果这些类只在一个字符串变量中不同,为什么有多个类?为什么一个类的构造函数不接受字符串参数呢?
*(new std::string(lang))
是内存泄漏。你只需要
\u langName=lName
或者更好的是
\u langName(lName)
在初始化器列表中。哇。。。我没想到解决办法会这么简单。谢谢你,伙计!!
cName<CppPolicy> CppName;