Расширение массива указателей в C ++ - PullRequest
1 голос
/ 02 апреля 2012

Я программист Java, потерянный в C ++ и указатели: D

У меня есть массив указателей на Bucket-Objects

Bucket<E>* index = new Bucket<E>[2];

Я инициализирую его так:

index[0] points to Bucket1
index[1] points to Bucket2

А затем я хочу удвоить размер массива и связать дополнительные записи следующим образом:

index[0] points to Bucket1
index[1] points to Bucket2
index[2] points to Bucket1
index[3] points to Bucket2

Пока у меня есть этот код, который генерирует копии объектов Bucket-объектов иЯ этого не хочу!

for (size_t i = 0; i < newSize; ++i)
{
    if (i < oldIndexSize)
       newIndex[i] = index[i];
    else
       newIndex[i] = index[i - oldIndexSize];

} 

Ответы [ 4 ]

2 голосов
/ 02 апреля 2012

У меня есть массив указателей на объекты Bucket

Нет, у вас есть указатель на массив объектов Bucket.Массив указателей на объекты Bucket будет выглядеть следующим образом:

Bucket<E> * index[2];

Динамически размещенный массив указателей на объекты Bucket будет объявлен следующим образом:

Bucket<E> ** index = new Bucket<E>*[N];

Но то, что вы, вероятно, должны, вероятно,использовать - это вектор общих указателей на объекты, например:

std::vector<std::shared_ptr<Bucket<E>>> index;
1 голос
/ 02 апреля 2012

Я программист Java, потерянный в C ++ и указатели: D

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

У меня есть массив указателей на Bucket-Objects

Bucket * index = new Bucket [2];

Если экземпляры Bucket, которые вы храните в массиве, не являются общими, вы можете использовать vector<unique_ptr<Bucket>>. Иначе, если есть общая семантика, вы можете использовать vector<shared_ptr<Bucket>>. Вы можете использовать метод vector::push_back() для добавления новых экземпляров Bucket в вектор, который будет динамически расти. Если вы решите использовать умный указатель shared_ptr<>, выделите экземпляры Bucket, используя make_shared вместо raw operator new.

Существует очень интересная серия уроков STL на 9-м канале , которую ведет сопровождающий STL из Visual C ++ Team. Вы можете рассмотреть часть 1 (контейнеры последовательности) и часть 3 (умные указатели) .

1 голос
/ 02 апреля 2012

Не изобретай велосипед заново.Используйте std::vector<Bucket<E> >, если вы хотите изменить размер массива.Если вы не хотите, чтобы сегменты копировались, вам придется использовать некоторую косвенность.Например с умными указателями:

std::vector<std::shared_ptr<Bucket<E>>> index {std::make_shared<Bucket<E>>()/*, ...*/}
0 голосов
/ 02 апреля 2012

Если это массив указателей, он не будет создавать копию объекта, это будет только копия указателя, и кажется, что этот код выполняет то, что вам нужно.

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