Терминология персистентности объекта: «хранилище» против «хранилище» против «контекст» против «извлечение» против (…)

Я не уверен, как назвать классы хранилища данных при разработке уровня доступа к данным (DAL) программы.

(Под классом хранилища данных я имею в виду класс, который отвечает за чтение сохраненного объекта в память или сохранение объекта в памяти.)

Представляется разумным назвать класс хранилища данных в соответствии с двумя вещами:

  • какие типы объектов он обрабатывает;
  • загружает ли он и / или сохраняет такие объекты.

⇒ Класс, который загружает объекты Banana , можно назвать, например, BananaSource .

Я не знаю, как это сделать вторая точка (т. е. бит Source в примере). Я видел разные существительные, по-видимому, используемые только для этой цели:

  • хранилище : звучит очень обобщенно. Означает ли это что-то доступное для чтения / записи?
  • store : это звучит как что-то, что потенциально дает доступ для записи.
  • context : звучит очень абстрактно. Я видел это с LINQ и объектно-реляционными сопоставителями (ORM).
    PS (несколько месяцев спустя): это, вероятно, подходит для контейнеров, которые содержат «активные» или иным образом контролируемые объекты (на ум приходит шаблон «Единица работы»). ).
  • retriever : звучит как что-то только для чтения.
  • source & sink : возможно, не подходит для персистентности объекта; лучше подходит для потоков данных?
  • читатель / писатель : вполне понятен в своем намерении, но звучит слишком технически для меня.

Эти имена являются произвольными или существуют общепринятые значения / семантические различия позади каждого? В частности, мне интересно: класс __declspec (dllimport) MyClass {public: // stuff private: static int myInt; }; // .cpp файл int MyClass :: myInt = 0; Я получаю ...

У меня есть класс, который выглядит следующим образом:

//.h file
class __declspec(dllimport) MyClass
{
    public:
    //stuff
    private:

    static int myInt;
};

// .cpp file
int MyClass::myInt = 0;

Я получаю следующую ошибку компиляции:

error C2491: 'MyClass::myInt' : definition of dllimport static data member not allowed

Что мне делать?

18
задан MBZ 16 August 2010 в 09:34
поделиться

3 ответа

__ declspec (dllimport) означает, что текущий код использует DLL, реализующую ваш класс. Таким образом, функции-члены и статические элементы данных определены в DLL, и повторное их определение в вашей программе является ошибкой.

Если вы пытаетесь написать код для библиотеки DLL, которая реализует этот класс (и таким образом определяет функции-члены и статические элементы данных), вам нужно вместо этого пометить класс __ declspec (dllexport) .

Обычно для этого используют макрос. При создании вашей DLL вы определяете макрос BUILDING_MYDLL или аналогичный. В вашем заголовке для MyClass у вас есть:

    #ifdef _MSC_VER
    #  ifdef BUILDING_MYDLL
    #    define MYCLASS_DECLSPEC __declspec(dllexport)
    #  else
    #    define MYCLASS_DECLSPEC __declspec(dllimport)
    #  endif
    #endif

    class MYCLASS_DECLSPEC MyClass
    {
        ...
    };

Это означает, что вы можете совместно использовать заголовок между DLL и приложением, которое использует DLL.

30
ответ дан 30 November 2019 в 07:38
поделиться

Из Документация MSDN ,

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

Надеюсь, это поможет ..

4
ответ дан 30 November 2019 в 07:38
поделиться

Если вы импортируете класс, вы импортируете его со всеми его членами, поэтому невозможно определить какой-либо член класса на «стороне клиента». Ключевое слово dllexport должно использоваться от имени реализации dll

0
ответ дан 30 November 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: