Как создать оператор, который копирует один массив в другой в C ++ - PullRequest
1 голос
/ 16 августа 2011

Мне нужно создать оператор, который будет копировать содержимое одного массива в другой.АКА оператор равных.Я думаю что-то вроде этого:

    operator=(string array[10][10], string array2[10][10])
    {
        int row = 0; int column = 0;
        for(column=0; column<=9; column++)
        {
            for(row=0; row<=9; row++){
                array2[row][column]=array[row][column];
            }
        }
    }

Я просто не уверен в синтаксисе объявлений операторов, что является моей проблемой.Я знаю, как сделать внутренний код, даже если я неправильно отобразил код, показанный выше.Я просто не уверен, как написать "operator = (string ....)"

Ответы [ 2 ]

9 голосов
/ 16 августа 2011

Вы не можете. По двум причинам

  • Массив является встроенным типом, перегрузка оператора допускается только в том случае, если хотя бы один из аргументов является пользовательским типом
  • operator = - это один из 4 операторов (вместе с [], () и ->), которые должны быть членами класса, для которого они перегружены 1 , Массив не является классом.

Что вы можете сделать, это

  • Именованная функция вместо оператора

  • Обернуть массив в класс

  • использовать vector<vector<string> >, у которого уже есть назначение ( <- мой голос идет сюда </strong>)

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

1 голос
/ 16 августа 2011

Вы не можете перегружать операторы в C ++, если один из аргументов не относится к типу класса (или оператор не является шаблоном).Это имеет смысл, потому что в противном случае вы можете сделать Сумасшедшие вещи, например, переопределить встроенный оператор + для целых чисел, чтобы выполнить вычитание:

int operator+ (int lhs, int rhs) { // Not legal
    return lhs - rhs; // Whoops!
}

В случае того, что вы делаете, вы пытаетесь переопределитьчто означает operator = для массивов, что недопустимо.Более того, это не очень хорошая идея, потому что, если бы она была успешной, это нарушило бы принцип наименьшего сюрприза, так как вы могли бы сделать такой код, который обычно незаконен, внезапно скомпилировать:

string array[10][10], string array2[10][10];
array = array2; // Problem; this isn't legal C++ code!

Если вы хотитеПоддерживая глубокое копирование массива, вам нужно написать собственную функцию для этого, которая не является перегруженным оператором присваивания.В качестве альтернативы, и, возможно, гораздо более удачной идеи, вам следует рассмотреть обертывание массивов либо в классе, либо в структуре.Затем вы можете перегрузить operator = на этот класс или структуру, чтобы сделать глубокое копирование.Кроме того, вы получите дополнительное преимущество, заключающееся в том, что вы можете запретить пользователям доступ к массивам с недопустимыми индексами, поскольку вы можете определить методы получения и установки, которые будут проверять индекс.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...