C ++ Добавить объект в массив - PullRequest
       1

C ++ Добавить объект в массив

0 голосов
/ 15 сентября 2010

Мне нужно создать экземпляр объекта и добавить его в массив.Это то, что я сейчас использую в методе:

Row r;
rows[count] = r;

Проблема в том, что r находится в стеке и удаляется после выхода из функции.Я быстро исправлю это, чтобы сделать r статичным, но это плохо, верно?Что я должен делать?(Извините, завершите C ++ noob).

Редактировать: Удаление деконструктора для строки решает проблему.

Ответы [ 3 ]

7 голосов
/ 15 сентября 2010

Строка rows[count] = r копирует объект r в элемент с индексом count в массиве. После этого не имеет значения, что происходит с r, массив не изменяется.

[Редактировать: ОК, косвенно имеет значение, что происходит с r - поскольку копия использует что-то, что r может удалить.]

Это удивительно, если вы привыкли (например) к Java, где элемент массива на самом деле не является объектом, это просто ссылка на него.

3 голосов
/ 15 сентября 2010

Используйте std::vector вместо массива, при условии, что конструкция Row не является трудной:

std::vector<Row> rows;

Row r;
rows.push_back(r);

Когда вектор выходит из области видимости, деструктор ~Row() будет вызываться для каждой записи.

Вы можете получить доступ к самой последней добавленной записи, используя

const Row& last = rows.back();

или

size_t count = rows.size();
const Row& last = rows[count - 1];
0 голосов
/ 15 сентября 2010

В этом случае вы фактически создаете его в стеке, а затем копируете объект в строки местоположения [count]. Обратите внимание, что если вы создали строки как массив объектов Row, в этом месте уже был объект Row, созданный с помощью конструктора по умолчанию, который вы скопировали.

По разным причинам в C ++ мы пытаемся использовать контейнеры стандартной библиотеки, такие как std :: vector и std :: list. Они будут расширены для обработки новых элементов, которые вы добавляете.

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