Инициализировать ссылку на элемент со значением по умолчанию - PullRequest
0 голосов
/ 12 июня 2018

У меня есть класс с std::vector const& членом, который должен быть установлен через конструктор.Однако также должна быть возможность пропустить этот параметр в конструкторе и позволить элементу инициализироваться значением по умолчанию.

Пример кода:

class MyClass {
public:
  MyClass(int a, const std::vector<int> &v = {42,42,42}) : vec(v){}

  const std::vector<int> &vec;
};

int main(void) {

  std::vector<int> a{1,2,3};

  MyClass c1(1,a);              // c1.vec = 1,2,3
  MyClass c2(1);                // c2.vec = randomStuff
                                // should actually be 42,42,42
}

Если я изменю инициализацию на:

MyClass(int a, const std::vector<int> &v = *(new std::vector<int>{42,42,42})) : vec(v){}

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

1 Ответ

0 голосов
/ 12 июня 2018

Вы можете определить аргумент по умолчанию в качестве статического члена данных вашего класса:

class MyClass {
 public:
  MyClass(int a, const std::vector<int> &v = defaultVec) : vec(v){}

  const std::vector<int> &vec;

 private:
  static const std::vector<int> defaultVec;
};

const std::vector<int> MyClass:defaultVec{42, 42, 42};

Чтобы оставить только заголовок класса, вы также можете использовать статическую переменную в статической функции-члене:

class MyClass {
 public:
  MyClass(int a, const std::vector<int> &v = defaultVec()) : vec(v){}

  const std::vector<int> &vec;

 private:
  static const std::vector<int>& defaultVec()
  {
   static const std::vector<int> v {42, 42, 42};
   return v;
  }
};

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

...