Как мне клонировать неровный массив в классе C ++? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть шаблонный класс, который я использую для создания зубчатого массива и управления им.Я могу создать зубчатый массив;добавить элементы;удалить их;изменить их;распечатка зубчатого массива и т. д. Похоже, что до сих пор я работаю не хуже моего тестирования, пока я не попытаюсь передать ему ранее созданный зубчатый массив для создания другого.Мой класс в настоящее время принимает то, что передано, и создает то, что кажется клоном, но в итоге он становится псевдонимом для того же пространства памяти.Итак, когда я иду к изменению того, что я считаю клоном, я заканчиваю тем, что меняю их обоих.Я немного растерялся, и мне было интересно, кто-нибудь может дать мне несколько советов?

1 Ответ

0 голосов
/ 27 сентября 2019

Трудно точно сказать, в чем ваша проблема, без примера кода, но, похоже, ваш массив содержит указатели.Например:

std::vector<int*> original;
original.push_back(new int[]{1}); // note: for demo only (`new` without `delete` is bad)
std::vector<int*> copy = original;
copy[0][0] = 2; // now original[0][0] also equals 2

Так как copy содержит те же указатели, что и original, original[0] и copy[0] являются одним и тем же указателем, и поэтому original[0][0] и copy[0][0] относятся к одному и тому жеobject.

Это можно исправить, скопировав указанные значения, а не сами указатели, и сохранив указатели на копии в новом массиве.В моем примере проще всего было бы использовать std::vector<int> вместо int*:

std::vector<std::vector<int>> original;
original.push_back({1});
std::vector<std::vector<int>> copy = original;
copy[0][0] = 2; // original[0][0] still equals 1
...