Дублирование массивов при выравнивании объектов - PullRequest
1 голос
/ 16 марта 2009

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

У меня есть класс 'SA', состоящий из нескольких объектов 'Obj1', 'Obj2' и т. Д. *

Внутри класса у меня есть динамический массив 'SA_Array', который я инициализирую следующим образом, где размер устанавливает его длину:

double * SA_Array;
SA_Array = new double [size];

Теперь я пытался использовать оператор '=' для указанных выше объектов, чтобы сделать копии массива в каждом объекте. К сожалению, я понял, что он уравнивает только указатель и, следовательно, если я изменяю массив в одном объекте, все объекты SA_Array изменяются одинаково ... По сути, остается только одна копия массива.

например. Obj1.SA_Array == Obj2.SA_Array ...

Есть ли хорошие предложения относительно того, как преодолеть это и получить объектно-ориентированные копии SA_Array?

Ответы [ 2 ]

3 голосов
/ 16 марта 2009

Если размер определяется во время выполнения, проще всего использовать вектор

vector<double> SA_Array(size);

Теперь вы можете скопировать, поменять, изменить его размер и он будет действовать соответственно. Если вам нужен указатель на начало, вы можете сделать это с помощью &SA_Array[0]. Если размер определен и исправлен во время компиляции, вы можете использовать boost :: array

boost::array<double, size> SA_Array;

Вы можете использовать его как массив, но также можете скопировать его и делать такие вещи, как SA_Array.begin(), как с вектором. Если вам нужен указатель на начало, вы можете сделать это с помощью SA_Array.data() или &SA_Array[0].

Существует способ использовать необработанные указатели, как вы, и копировать их вручную

double *SA_Array;
SA_Array = new double[size];

double *SA_Copy;
SA_Copy = new double[size];
std::copy(SA_Array, SA_Array + size, SA_Copy);

Но это громоздко, так как вам нужно будет запомнить delete[] их, что вектор сделает все за вас.

0 голосов
/ 16 марта 2009

Либо используйте стандартную библиотечную коллекцию, такую ​​как std::vector<double>, либо, в редких случаях, когда вам нужны необработанные массивы, вы можете написать конструктор копирования, заботясь о безопасности исключений.

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