Другие языки программирования и технологии

Есть ли ошибка? Может ли возникнуть? И вообще приемлимо ли? C++ классы

/////////////////////////////////////////////////////////////////////есть класс
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
Не выделяю ли я слишком много памяти? Или мне только кажется? Может ли такой способ привести в будущем к катастрофическим ошибкам?
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. Найти еще како-нибудь путь (и), ведь у всех есть вои достинства и недостатки ))).
ЕВ
Евгений Вакуленко
3 437
Лучший ответ
Евгений Вакуленко Авось будет полезно.

Еще советуют освобождать память там же, где выделяют (относится к new / delete), т. к клиентское и серверное (dll) приложения могут быть собраны с разными по линковке версиями CRT, и это потенциально может вести к ошибкам времени выполнения.

Один из выходов - перенести управление временем жизни объекта в сам объект, как это сделано в COM. Или, например, использовать smart pointers + custom deleter (устанавливать его на сервере (dll)).
Хм, я правильно понял, что у вас проблемы с инкапсуляцией?
1. Можно инициализиравать переменные передовая их как, входные параметры конструктора например
myclass::myclass(int a, int b){
тут приватная переменная получает что хочет
z=a;
k=b;
}
2. Вариант вы создаете паблик методы, в которых передаете свои входные параметры, как в предыдущем случае.
А[Z]А ^^
А[Z]А ^^
35 594
конструкция хитрая - инициализировать самого в себе...
На счет памяти - поэкспериментируйте создавая объекты в множестве и глянте как памяь оасходуется
А не надо ли добавить освобождение памяти при смерти объекта? (деструктор)
Вообще с таким лучше на спец формумы, хоть на делфи кингдом или что бо С++ есть