#c #c 11 #vector #operator-keyword #copy-constructor
Вопрос:
Я пытаюсь создать конструктор копий для игры. на протяжении всего конструктора копирования мне приходится копировать элементы одной игры в другую. Однако когда я пытаюсь получить доступ к внутренним элементам игры, которые я хочу скопировать, я получаю сообщение об ошибке :
no operator "[]" matches these operands -- operand types are: mtm::Game [ std::_Vector_const_iterator<std::_Vector_val<std::conditional_t<true, std::_Simple_types<std::vector<char, std::allocator<char>>>, std::_Vec_iter_types<std::vector<char, std::allocator<char>>, size_t, ptrdiff_t, std::vector<char, std::allocator<char>> *, const std::vector<char, std::allocator<char>> *, std::vector<char, std::allocator<char>> amp;, const std::vector<char, std::allocator<char>> amp;>>>> ]C/C (349)
Я был бы признателен за любую помощь в объяснении того, почему оператор [] не работает, вот фрагмент кода, который я написал :
Game::Game(const Gameamp; other)
{
Game game(other.height, other.width);
for (vector<vector<char>>::const_iterator row = other.game.begin(); row !=
other.game.end(); row )
{
for(vector<char>::const_iterator col = row->begin(); col != row->end(); col )
{
game[row][col] = other[row][col]; ///////???
}
}
В дополнение к этому я хотел бы спросить, лучше ли выделить игру с помощью «новой» или просто объявить ее, как я сделал в своем сегменте кода выше.
Комментарии:
1. Сначала вы можете удалить весь конструктор копирования, потому что конструктор копирования по умолчанию уже работает, если нет других переменных.
2. И итератор-это ничто, что вы можете использовать для обозначения вектора, а итератор больше похож на указатель на элемент, поэтому вам нужно только разыменовать переменную строки, чтобы получить строку.
3. @Lala5th я пробовал использовать в, но это тоже не сработало
4. @gerum ты имеешь в виду, что я должен *грести ? и есть еще несколько переменных, которые я просто не включил в сегмент кода
5. @Saleh Ваш копирайтер не имеет никакого эффекта. Просто удалите его, одного по умолчанию будет достаточно. Вы пытаетесь скопировать данные из
other
локальной переменнойgame
. После завершения процесса копирования эта локальная переменная перестанет существовать, а текущий экземпляр останется неинициализированным. (если только вы не сделаете что-то сgame
тем, что вы здесь не показали)
Ответ №1:
[]
Оператор вектора ожидает size_t
аргумента. Вы передаете итератор, поэтому он не компилируется.
other[row][col]
может быть заменен просто *col
. game[row][col]
это немного сложнее, вы не можете использовать row
col
итераторы and game
, так как они взяты из другого контейнера. Вы можете преобразовать итераторы в числовые индексы , вычитая их из begin
, например: other[row - other.game.begin()][col - row->begin()]
. Это становится довольно трудным для чтения, поэтому вам может быть лучше либо использовать два отдельных итератора для каждого контейнера, либо просто использовать индексы для обоих контейнеров.
Лучшее решение-позволить стандартной библиотеке выполнять работу за вас:
std::copy(other.game.begin(), other.game.end(), game.begin());
Нет необходимости копировать элементы внутреннего вектора один за другим, назначение вектора другому делает копирование за вас.