В C ++, как использовать синглтон из отдельного исходного файла? - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь скомпилировать программу-оболочку других людей в большой системе, в которой она использует глобальный объект из другого файла, определение класса выглядит следующим образом:

class __declspec(dllexport) A
{
...
static A * instance;
}

И в моем отдельном исходном файле (который я хочу собрать в .exe) я включил заголовочный файл A.h и объявил в начале так:

A * A::instance;

для доступа к данным в A.

Проблема в том, что этот фрагмент кода может быть успешно собран в Linux, теперь, когда я пытаюсь встроить его в Windows NT, у него будут проблемы.

  1. Если я оставлю это так, компилятор пожалуется на C2491 error, definition of dllimport function not allowed.

  2. Если я уберу эту строку объявления A, я получу много ошибок LNK2001: unresolved external symbol.

Не совсем уверен, в чем здесь проблема, я провел некоторые исследования в Интернете, но не смог найти хорошего ответа, я сам не слишком знаком с импортом / экспортом DLL и некоторыми хитростями C ++. Может ли кто-нибудь дать некоторое представление о проблеме или о том, в каком направлении мне уделить время, чтобы выяснить это?

Или, скажем, если у меня уже есть такой статический объект, и я хочу написать другую программу для доступа к нему, как именно мне это сделать?

Пожалуйста, исправьте меня, если я здесь допустил какие-либо ошибки. Спасибо!

Ответы [ 4 ]

1 голос
/ 23 ноября 2011

Я думаю, что вам нужно ключевое слово extern, например:

extern A *A::instance;

Это говорит о том, что переменная A::instance определена где-то еще, но вы сообщаете об этом компилятору, чтобы вы моглииспользуйте его по имени в этом файле.

0 голосов
/ 23 ноября 2011

Лично я обычно скрываю экземпляр в файле .cpp в анонимном пространстве имен.Затем я предоставляю функцию getInstance (), которая возвращает указатель или ссылку на нее, и я делаю dllExport для этой функции.

Если вы хотите принудительно применить вещи, вы можете сделать конструкторы для A приватными и сделать getInstance другом.

0 голосов
/ 23 ноября 2011

Singleton обычно имеет функцию, такую ​​как

A::instance = NULL;
A * get_instance() {if (!A::instance) A::instance = new A; return A::instance;}

Если у вас есть такая функция, вам не нужно обращаться к A :: instance напрямую.

И извините, но чтоты делаешь?Включение заголовка C ++ в программу на C?Это даже компилируется?

0 голосов
/ 23 ноября 2011

__declspec (dllexport) используется, когда вы хотите экспортировать свою функцию в DLL.В этом нет необходимости, если вы не вызываете класс из другой библиотеки DLL.

Но я подозреваю, что ваша проблема связана с использованием файлов .c, а не со спецификацией класса.Попробуй прочитать это кстати.В нем подробно рассматривается dllexport Windows & C ++: extern & __declspec (dllimport)

...