Я не уверен, как назвать классы хранилища данных при разработке уровня доступа к данным (DAL) программы.
(Под классом хранилища данных я имею в виду класс, который отвечает за чтение сохраненного объекта в память или сохранение объекта в памяти.)
Представляется разумным назвать класс хранилища данных в соответствии с двумя вещами:
⇒ Класс, который загружает объекты Banana
, можно назвать, например, BananaSource
.
Я не знаю, как это сделать вторая точка (т. е. бит Source
в примере). Я видел разные существительные, по-видимому, используемые только для этой цели:
Эти имена являются произвольными или существуют общепринятые значения / семантические различия позади каждого? В частности, мне интересно: класс __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
Что мне делать?
__ 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.
Из Документация MSDN ,
Когда вы объявляете класс dllimport, все его функции-члены и статические элементы данных импортируются. в отличие от поведение dllimport и dllexport на неклассовые типы, статические элементы данных не может указать определение в та же программа, в которой dllimport класс определен .
Надеюсь, это поможет ..
Если вы импортируете класс, вы импортируете его со всеми его членами, поэтому невозможно определить какой-либо член класса на «стороне клиента». Ключевое слово dllexport должно использоваться от имени реализации dll