2010-06-09 56 views
0

下面的宏是在我们的代码中定义:宣言对象为其创建被包裹在宏

#define MSGMacro(obj, arg) MyPaymentClass obj(arg) 

在使用MSGMacro使用代码来创建MyPaymentClass类型的对象等

MSGMacro(Card, 1); 
MSGMacro(Cash, 2); 
---- 
---- //removed unwanted things to keep question cleaner. 

所有上述代码都在一个cpp文件中,现在问题是我们如何才能将MyPaymentClass这两个对象公开给我项目中的其他单元? 即我想在其他CPP文件中使用CardCash。请建议我如何在某个头文件中提供相同的声明?

回答

1

创建另一个宏声明这些变量:如果你想同一个文件展位申报最终

/* example.h */ 
#define MSGMacroDeclare(obj) extern MyPaymentClass obj; 
MSGMacroDeclare(Card); 
MSGMacroDeclare(Cash); 
... 

/* example.cpp */ 
#define MSGMacroDefine(obj, arg) extern MyPaymentClass obj(arg); 
MSGMacroDefine(Card, 1); 
MSGMacroDefine(Cash, 2); 
... 

,并定义它们,你可以使用某事像这样:

/* example.h */ 
#ifndef MSGMacro 
    #define MSGMacro(obj, arg) extern MyPaymentClass obj 
#endif 
MSGMacro(Card, 1); 
MSGMacro(Cash, 2); 
... 

/* example.cpp */ 
#define MSGMacro(obj, arg) extern MyPaymentClass obj(arg) 
#include "example.h" 

但是这使得只有当这些(许多全局变量......嗯......)中有许多很多很多时,才会感觉到,并且列表正在频繁地更改,通常这是不寻常的

1

我不明白为什么你会在这种情况下使用一个宏,它就像声明对象一样容易。就暴露这些实例而言,你可以让它们成为全局静态对象,但这通常是不被接受的。你应该弄清楚这些对象是如何与你的应用程序的其余部分相关联的,并找到一个合适的地方将它们暴露给你的其他代码。

+1

我也怀疑这些宏的价值,但可能不管它们是因为在这里发布问题而被简化了吗? – 2010-06-09 17:48:06

+0

U是正确的迈克尔事情被清理和重新编写只是为了张贴问题清楚。 – Learner 2010-06-09 18:13:26

1

您可以创建访问函数:

const MyPaymentClass &getCard() 
{ 
    return card; 
} 

您还需要为函数添加一个原型头文件:

const MyPaymentClass &getCard(); 
0

这些是全局对象?然后,一个简单的extern MyPaymentClass Card;extern MyPaymentClass Cash;应该做的伎俩(讨论全球变量的适当性消失)。

当然,您也可以将引用或指向这些对象的指针传递给其他函数,而不管它们是否是全局变量(但是如果它们不是这些对象,则仍然必须考虑这些对象的生存期静态/全球)。