Объявление объекта, для которого создание обернуто в макрос - PullRequest
0 голосов
/ 09 июня 2010

В нашем коде определен следующий макрос:

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

Где MSGMacro используется для создания объекта типа MyPaymentClass с использованием кода, подобного

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

ВсеКод выше находится в одном файле cpp. Теперь проблема в том, как мы можем представить эти два объекта MyPaymentClass другим модулям в моем проекте?т.е. я хочу использовать Card и Cash в других файлах CPP.Подскажите пожалуйста, как я могу дать декларацию для того же в каком-то заголовочном файле?

Ответы [ 4 ]

1 голос
/ 09 июня 2010

Создайте еще один макрос для объявления этих переменных:

/* 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);
...

В конце концов, если вы хотите, чтобы один и тот же файл объявлял и определял их, вы можете использовать sth так:

/* 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 голос
/ 09 июня 2010

Вы можете создать функции доступа:

const MyPaymentClass &getCard()
{
    return card;
}

Вам также необходимо добавить прототип этой функции в файл заголовка:

const MyPaymentClass &getCard();
1 голос
/ 09 июня 2010

Я не могу понять, почему вы используете макрос в этом случае, так же просто объявить объект. Что касается раскрытия этих экземпляров, вы можете сделать их глобальными статическими объектами, но это, как правило, осуждается. Вы должны выяснить, как эти объекты связаны с остальной частью вашего приложения, и найти подходящее место, чтобы представить их остальной части вашего кода.

0 голосов
/ 09 июня 2010

Это глобальные объекты? Тогда простые extern MyPaymentClass Card; и extern MyPaymentClass Cash; должны сделать свое дело (дискуссия о целесообразности глобальных изменений).

Конечно, вы также можете передавать ссылки или указатели на эти объекты другим функциям, независимо от того, являются ли они глобальными переменными (но вам все равно придется учитывать время жизни этих объектов, если они не являются статичными /global).

...