Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象和它';在一个宏定义调用中调用类定义_C++_Macros - Fatal编程技术网

C++ 对象和它';在一个宏定义调用中调用类定义

C++ 对象和它';在一个宏定义调用中调用类定义,c++,macros,C++,Macros,我想写一个宏,在下面的用法中,它定义了一个全局对象foobar,该对象是在它下面定义的类 SOMEMACRO(foobar) { public: int a; }; 换言之,我希望上述内容具有与以下内容相同的效果: class SomeClassPossiblyWith_foobar_InItsName { public: int a; }; SomeClassPossiblyWith_foobar_InItsName foobar; 为对象精确地指定“foobar”名称(或者至

我想写一个宏,在下面的用法中,它定义了一个全局对象
foobar
,该对象是在它下面定义的类

SOMEMACRO(foobar)
{
public:
   int a;
};
换言之,我希望上述内容具有与以下内容相同的效果:

class SomeClassPossiblyWith_foobar_InItsName
{
public:
   int a;
};
SomeClassPossiblyWith_foobar_InItsName foobar;
为对象精确地指定“foobar”名称(或者至少以这种方式调用对适当对象的引用)非常重要。只要允许多次使用宏,类的名称就无关紧要


这相当困难,因为类通常应该在使用之前定义,但可能存在一些棘手的(可能涉及模板)实现方法?

使用预处理器串联运算符
非常简单

比如:

#define SOMEMACRO(name) \
SomeClassPossiblyWith_##name##_InItsName name; \
class SomeClassPossiblyWith_##name##_InItsName

同时,我已经找到了一个解决方案,可以进行引用,并用适当的对象初始化它,它以某种方式回答了这个问题。我不确定这是标准投诉(符合gcc 4.6)

模板
延迟生成对象(&U)
{
静态T-obj;
返回obj;
}
#定义DOIT(_name)\
###u name的类类型\
TypeFor###(u name&_name=delayed_make_object())\
###u名称的类类型
多伊特(富)
{
公众:
国际广播公司;
};  
多伊特(酒吧)
{
公众:
国际cba;
};
int main()
{
foo.abc=bar.cba;//有效!
}
您可以这样做:

#define SING(classname, body) class SING_##classname \
body \
; SING_##classname classname;
SING (foobar, {
    public:
        int a;
    }
);
然后,这样使用它:

#define SING(classname, body) class SING_##classname \
body \
; SING_##classname classname;
SING (foobar, {
    public:
        int a;
    }
);

编辑:为代码添加了更多解释

具有模板的解决方案如下所示:

我已经为类创建了一个模板,这些类在创建时应该有一个具有全局访问权限的实例。我想这就是你想要的。(我将其命名为Singleton reffering,以名称引用设计模式) .h:


然而,这个解决方案的问题是,单例模板将只适用于具有空构造函数的类。但是你的例子也是如此,所以我认为这就是你想要的。

我不知道你为什么要这样做,但类似的是在宏中有类:不完全是这个,但也是有趣的想法。但是你为什么要这样做呢?宏只是扩展成文本,它不能神奇地在其他地方插入更多文本。当然,这是最简单的部分。问题是,在这个类的对象被完全定义之前,我无法实例化它。我认为它不会编译。在声明类之前正在创建一个对象实例。@Deidara senpai,如果您同意将指针作为对象,这将起作用。我认为移动一个括号比移动一个指针损失小。是的,@chris在对我的问题的评论中建议了这一点。但是它也有一些缺点(不能在正文中使用逗号,正文中的编译器错误会被奇怪地报告)。
// C++ source for template Singleton
template<typename T>
Singleton<T>* Singleton<T>::instance = NULL;

template<typename T>
Singleton<T>::Singleton()
: T()
{}

template<typename T>
Singleton<T>* Singleton<T>::getInstance()
{
    if (instance == NULL)
    {
        instance = new Singleton<T>();
    }
    return instance;
}
// Definition of class foobar
class foobar_impl {
public:
    int a;
};

typedef Singleton<foobar_impl> Foobar;
int main(int argc, char** argv)
{
    Foobar *pf = Foobar::getInstance();
    return 0;
}