/////////////////////////////////////////////////////////////////////есть класс
class my_class
{
public:
my_class Init_my_class_object(param 1, param 2,param 3)
};
///////////////реализация в dll/////////////////////////////////////
my_class Init_my_class_object(param 1, param 2,param 3)
{
my_class* m = new my_class;
//прочие инициализации
return m;
}
///////////////////////сама программа//////////////////////////////////////
{
my_class* obj = obj->Init_my_class_object(a, b, c);
}
/////////////////////////////////////////////////////////////////////////////////////////
Нужно инициализировать скрытые переменные и прочие которые не доступны. они в DLL и знакомы только dll'ке а на прямую давать доступ как то не красиво и не зачем.
Единственное что пришло на ум так создать такую вот конструкцию.
интересует при создании, в dll в классе, создается объект и выделяется память, потом возвращается объект в .exe
Не выделяю ли я слишком много памяти? Или мне только кажется? Может ли такой способ привести в будущем к катастрофическим ошибкам?
Другие языки программирования и технологии
Есть ли ошибка? Может ли возникнуть? И вообще приемлимо ли? C++ классы
1. Есть такая штука, COM (Component Object Model). Можно применить метод отделения интерфейса от реализации из нее, типа так:
// interface (header)
class IDog {
public:
virtual ~IDog() = 0; // Pure virtual destructor, for delete
virtual void Yarr() = 0; // Pure virtual method
};
IDog::~IDog() {} // Yeah, pure virtual destructor should has body.
IDog* CreateDog(params...);
// dll implementation (cpp, cc, ..)
class Dog : public IDog {
public:
Dog(params...) { }
virtual ~Dog() { }
void Yarr() override {
std::cout << "Yarr..." << std::endl;
}
};
IDog* CreateDog(params...) {
return new (std::nothrow) Dog(params...);
}
// client
#include
#include "idog.h"
int main() {
IDog* dog = CreateDog(params...);
if (!dog) {
std::cerr << "Dog can't be created, no enough memory?" << std::endl;
return -1;
}
dog->Yarr();
delete dog;
return 0;
}
Потом можно использовать smart pointers (std::unique_ptr + std::move, например), чтобы избавиться от raw pointers + potential memory leaks.
2. Глянуть в сторону идиомы Pimpl
https://msdn.microsoft.com/en-us/library/hh438477.aspx
http://insidecpp.ru/patterns/pimpl_idiom/
http://habrahabr.ru/post/76248/
http://c2.com/cgi/wiki?PimplIdiom
3. Найти еще како-нибудь путь (и), ведь у всех есть вои достинства и недостатки ))).
// interface (header)
class IDog {
public:
virtual ~IDog() = 0; // Pure virtual destructor, for delete
virtual void Yarr() = 0; // Pure virtual method
};
IDog::~IDog() {} // Yeah, pure virtual destructor should has body.
IDog* CreateDog(params...);
// dll implementation (cpp, cc, ..)
class Dog : public IDog {
public:
Dog(params...) { }
virtual ~Dog() { }
void Yarr() override {
std::cout << "Yarr..." << std::endl;
}
};
IDog* CreateDog(params...) {
return new (std::nothrow) Dog(params...);
}
// client
#include
#include "idog.h"
int main() {
IDog* dog = CreateDog(params...);
if (!dog) {
std::cerr << "Dog can't be created, no enough memory?" << std::endl;
return -1;
}
dog->Yarr();
delete dog;
return 0;
}
Потом можно использовать smart pointers (std::unique_ptr + std::move, например), чтобы избавиться от raw pointers + potential memory leaks.
2. Глянуть в сторону идиомы Pimpl
https://msdn.microsoft.com/en-us/library/hh438477.aspx
http://insidecpp.ru/patterns/pimpl_idiom/
http://habrahabr.ru/post/76248/
http://c2.com/cgi/wiki?PimplIdiom
3. Найти еще како-нибудь путь (и), ведь у всех есть вои достинства и недостатки ))).
Хм, я правильно понял, что у вас проблемы с инкапсуляцией?
1. Можно инициализиравать переменные передовая их как, входные параметры конструктора например
myclass::myclass(int a, int b){
тут приватная переменная получает что хочет
z=a;
k=b;
}
2. Вариант вы создаете паблик методы, в которых передаете свои входные параметры, как в предыдущем случае.
1. Можно инициализиравать переменные передовая их как, входные параметры конструктора например
myclass::myclass(int a, int b){
тут приватная переменная получает что хочет
z=a;
k=b;
}
2. Вариант вы создаете паблик методы, в которых передаете свои входные параметры, как в предыдущем случае.
конструкция хитрая - инициализировать самого в себе...
На счет памяти - поэкспериментируйте создавая объекты в множестве и глянте как памяь оасходуется
А не надо ли добавить освобождение памяти при смерти объекта? (деструктор)
Вообще с таким лучше на спец формумы, хоть на делфи кингдом или что бо С++ есть
На счет памяти - поэкспериментируйте создавая объекты в множестве и глянте как памяь оасходуется
А не надо ли добавить освобождение памяти при смерти объекта? (деструктор)
Вообще с таким лучше на спец формумы, хоть на делфи кингдом или что бо С++ есть
Похожие вопросы
- C++ Классы
- C++ Классы и Переменные
- OpenProcess ошибка Access is denied. в windows 7 Visual C++ 2008
- C++ классы и структуры
- Зачем вообще указатели в C++?
- C++. Классы.
- Помогите исправить ошибку в программе (c++).
- Visual Studio C++, ошибка : "не удается найти указанный файл"
- c++ ошибка программы
- Где ошибка?C#
Еще советуют освобождать память там же, где выделяют (относится к new / delete), т. к клиентское и серверное (dll) приложения могут быть собраны с разными по линковке версиями CRT, и это потенциально может вести к ошибкам времени выполнения.
Один из выходов - перенести управление временем жизни объекта в сам объект, как это сделано в COM. Или, например, использовать smart pointers + custom deleter (устанавливать его на сервере (dll)).