Сокращение количества аргументов, передаваемых в функцию - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть класс с именем 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;
}

1 Ответ

0 голосов
/ 28 апреля 2020

Как уже объяснялось в различных комментариях, параметр, который является указателем, подобным Window *, никогда не будет создавать копию объекта Window. Вот почему указатель сделан для.

Прежде чем пытаться найти более сложные инструменты, такие как умные указатели, я советую вам сначала потратить время на понимание основ C ++. Вы должны начать с того, что является значением, что является указателем, что является ссылкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...