2010-06-09 53 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;應該做的伎倆(討論全球變量的適當性消失)。

當然,您也可以將引用或指向這些對象的指針傳遞給其他函數,而不管它們是否是全局變量(但是如果它們不是這些對象,則仍然必須考慮這些對象的生存期靜態/全球)。