Этот вопрос немного более обманчив, чем кажется, поэтому позвольте мне объяснить.
Предположим, у меня есть класс 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.
Попытки / предлагаемые решения:
Простая передача PlayersInTournament в конструктор Round () и создание его копии .
Я ДЕЙСТВИТЕЛЬНО хочу избежать этого, потому что это было бы много накладных расходов, когда все, для чего я бы использовал его, это поиск. В моей голове указатель или ссылка на PlayersInTournament может быть более желательным, потому что они будут занимать меньше памяти, когда список станет достаточно большим.
Создание ссылки как член класса.
Я считаю, что Раунд имеет композиционное отношение к Турниру. Время жизни Round не будет никогда превышать время жизни объекта Tournament, а также Round не «владеет» вектором, он предназначен только для управления Tournament.
Проблема, с которой я сразу столкнулся, заключается в том, что ссылки не могут иметь отложенную инициализацию. Мне не на что напрямую ссылаться, пока не будет создан сам круглый объект, так что у меня это не работает.
И, наконец,
Указатель на вектор как член класса.
Насколько я знаю, единственный способ сделать это - использовать vector.data (), который возвращает указатель на первый элемент в массиве используется внутренне вектором. Это позволило бы мне перебрать весь список для целей проверки, что нормально, но я намерен выполнить двоичный поиск вектора для подходящего игрока, и я не знаю, смогу ли я сделать это с помощью vector.data ().
Если я чего-то упускаю, или у меня есть неправильные представления, дайте мне знать. Я могу ошибаться, используя vector.data (), но я просто выгорел на этот день и хотел получить второе мнение, потому что это сольный проект, над которым я работаю для развлечения.
Спасибо за чтение!
Best,
Прав был Жюльен Бейкер