C ++: лучший способ передать вектор в конструктор для создания переменной-члена? - PullRequest
0 голосов
/ 18 июня 2020

Этот вопрос немного более обманчив, чем кажется, поэтому позвольте мне объяснить.


Предположим, у меня есть класс Tournament . Одна из переменных-членов - это вектор указателей Player.

class Tournament{
public:
 vector <shared_ptr<Player>> playersInTournament;
 vector <shared_ptr<Round>>  listOfRounds;
 //More code.

Предположим, у меня также есть класс с именем Round .

class Round{
public:
 vector <shared_ptr<Player>> playersInRound;
 Round(playersInTournament);
 //More code.

Round имеет метод с именем addPlayers () . Когда я добавляю игрока, я хочу выполнить поиск в векторе турнира PlayersInTournament , чтобы узнать, существует ли игрок.


Проблема:

Я не знаю, как напрямую ссылаться на PlayersInTournament , потому что я делаю это в рамках объекта Round.

Попытки / предлагаемые решения:

  1. Простая передача PlayersInTournament в конструктор Round () и создание его копии .

    Я ДЕЙСТВИТЕЛЬНО хочу избежать этого, потому что это было бы много накладных расходов, когда все, для чего я бы использовал его, это поиск. В моей голове указатель или ссылка на PlayersInTournament может быть более желательным, потому что они будут занимать меньше памяти, когда список станет достаточно большим.

  2. Создание ссылки как член класса.

    Я считаю, что Раунд имеет композиционное отношение к Турниру. Время жизни Round не будет никогда превышать время жизни объекта Tournament, а также Round не «владеет» вектором, он предназначен только для управления Tournament.

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

И, наконец,

Указатель на вектор как член класса.

Насколько я знаю, единственный способ сделать это - использовать vector.data (), который возвращает указатель на первый элемент в массиве используется внутренне вектором. Это позволило бы мне перебрать весь список для целей проверки, что нормально, но я намерен выполнить двоичный поиск вектора для подходящего игрока, и я не знаю, смогу ли я сделать это с помощью vector.data ().

Если я чего-то упускаю, или у меня есть неправильные представления, дайте мне знать. Я могу ошибаться, используя vector.data (), но я просто выгорел на этот день и хотел получить второе мнение, потому что это сольный проект, над которым я работаю для развлечения.

Спасибо за чтение!

Best,

Прав был Жюльен Бейкер

1 Ответ

0 голосов
/ 18 июня 2020

Это больше похоже на вопрос дизайна. Давайте рассмотрим ваш вопрос шаг за шагом.

Round имеет метод addPlayers (). Когда я добавляю игрока, я хочу выполнить поиск в векторе PlayersInTournament турнира, чтобы узнать, существует ли игрок.

Вы хотите добиться: «Пусть Round проверяет дублирование, когда addPlayers().

Я не знаю, как напрямую ссылаться на playerInTournament, потому что я делаю это в рамках объекта Round.

Затем вы обнаружили проблему: «Как сделать пусть Round узнает, сколько игроков в турнире? »

Чтобы ответить на ваш вопрос, давайте подумаем над следующими вопросами.

  1. Должен ли Round знать каждого игрока в турнире?
  2. Должен ли Round проверять, есть ли у addPlayers() дублирование?

Мое предложение - «нет».

  1. Раунд должен больше походить на POD, содержит только игроков в этом раунде.
  2. Должен быть round creator, чтобы определять, какие игроки должны быть в раунде.
  3. A round creator должен обрабатывать дублирование, поэтому addPlayer() будет только звонил однажды. Или никогда не существует. Поскольку вы можете опередить всех игроков в раунде при его строительстве.

Сделайте шаг назад и посмотрите, чего вы хотите достичь, и это может спасти вас от преждевременной оптимизации.

...