У меня есть класс с именем Window
и большой набор функций, для работы которых требуется экземпляр Window
. Таким образом, я передал Window* win
в качестве аргумента каждой из этих функций, но этот подход создает копию Window*
каждый раз, когда она вызывается, а также, кажется, что передача аргумента каждой функции кажется ненужной. Я попытался передать const Window*
, но это тоже не сработает, потому что функции внутри Window
не имеют const
версии. Я думал, что использование std:::shared_ptr
и std::weak_ptr
поможет, но я все еще не понял это правильно. Вот мой текущий код:
// Window.h
class Window
{
public:
// some getters/setters and other functions
private:
// members are here
};
// on another file
int func1(Window* win /*I want to remove this */, ...) {
// use win and other parameters
}
А вот подход интеллектуальных указателей.
// class Window as declared above
// file.h
namespace space
{
struct context;
context* make_context(std::shared_ptr<Window> const& win); // const& to avoid copy
void destroy_context(context* ctx);
int func1(...); // note that ... is used to show some params whose type isn't important for the question.
}
// some other functions
// file.cpp
namespace space
{
struct context
{
std::weak_ptr<Window> target;
};
context* make_context(std::shared_ptr<Window> const& win) // const& to avoid copy
{
context* ctx = new context{};
ctx->target = win;
return ctx;
}
void destroy_context(context* ctx)
{
if(ctx != nullptr)
{
delete ctx;
ctx = nullptr;
}
}
int func1(...)
{
// use ... params
} // int func1(...)
} // namespace space
// main.cpp
int main(int, char**)
{
std::shared_ptr<Window> window{new Window{/*some arguments*/}};
auto ctx{space::make_context(window)};
int func1();
// some other code
delete ctx;
}