Передача нового объекта в качестве аргумента по умолчанию в конструктор

У меня есть конструктор, который выглядит так:

RandomClass(const int16_t var1, const SecondClass& var2);

Мне нужно передать аргумент по умолчанию для второго параметра, поэтому в настоящее время я делаю что-то вроде этого:

RandomClass(const int16_t var1, const SecondClass& var2 = *(new SecondClass(*(new std::unordered_map<int16_t, double>())));

что невероятно неловко Обратите внимание, что я не хочу использовать перегруженный конструктор или изменять второй параметр из ссылки на указатель.

Каким будет элегантный способ передачи параметра по умолчанию?

2

Решение

Вам разрешено связать константную ссылку с временным:

RandomClass(const int16_t var1, const SecondClass& var2 = SecondClass(std::unordered_map<int16_t, double>()));

Конечно, это предполагает, что вы либо скопировать var2 в член или не используйте его после выхода из конструктора. Если это не так, значит что-то не так в вашем дизайне. Возможно, используя необработанный указатель или shared/weak_ptr более уместно.

3

Другие решения

Способ сделать это красиво состоит в том, чтобы обеспечить две перегрузки для вашего конструктора:

RandomClass(const int16_t var1, const SecondClass& var2)
{
// ...
}

RandomClass(const int16_t var1)
{
const SecondClass var2 = *(new SecondClass(*(new std::unordered_map<int16_t, double>()));
}

Однако у вас проблема гораздо хуже, чем выглядит. То, что вы имеете в этой второй перегрузке, невероятно ужасно, потому что это приводит к утечкам памяти — вам нужно delete все, что вы new но теперь вы потеряли след того, что вы newредактор Вы бы просто сделали это:

RandomClass(const int16_t var1)
{
const SecondClass var2{std::unordered_map<int16_t, double>()};
}

Не использовать new если вам не нужно — предпочитайте автоматическое время хранения.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector