2013-10-15 4 views
1

Я пытаюсь написать массив указателей для структур на C++. Моя главная цель - динамически добавлять указатели в массив. У меня возникли проблемы с synthaxИспользование структур и указательных массивов C++

struct items 
    { 
    int member1; 
    int member2; 
    }; 

    int N=5; 
    items **ptr=new item *[N]; // This is a ptr to an array of ptr's. Each ptr 
          // in this array needs to point to an items struct. 

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

+3

Идеальное решение, вероятно, является 'станд :: вектор ' или 'станд: : vector > '. – chris

ответ

3

Вы выделяющий только массив указателей item *, вам необходимо выделить память для каждого item также, например:

struct item // naming it 'items' might be confusing, and was used inconsistently 
      // in your code sample 
{ 
    int member1; 
    int member2; 
}; 

int N=5; 
item **ptr=new item *[N]; 

for(int i = 0; i < N; ++i) 
{ 
    ptr[i] = new item(); 
} 

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

ptr[2]->member1 = 42; // Sets member1 of the 3rd item element to 42 

Примечание, что вам нужно, чтобы освободить выделенную память где-то следующим образом:

for(int i = 0; i < N; ++i) 
{ 
    delete ptr[i]; 
} 
delete [] ptr; 

I Общие для вы бы лучше использовать C++ стандартный контейнер, как:

#include <vector> 

int N = 5; 
std::vector<item> myItems; 
myItems.resize(N,item()); 

myItems[2].member1 = 42; // Sets member1 of the 3rd item element to 42 

, который сделает все управление памятью для вас внутренним.
Если вы используете и не нужно динамически размера массивов можно даже избежать кучи распределяемой памяти вообще с помощью std::array:

#include <array> 

std::array<item,5> myItems; // Size is fixed to 5, you can't use a variable here 

myItems[2].member1 = 42; // Sets member1 of the 3rd item element to 42 
+0

Это работает. В чем преимущество использования векторов вместо того, что я сделал? Я новичок в C++ и еще не изучил про векторы. –

+0

А также вы написали, что элементы доступа к структуре выполняются с помощью: ptr [2] -> member1 = 42 ;. Каков его эквивалент? для ex: * (ptr [2]). id? –

+0

Не знаю, что именно вы имеете в виду с _'Что его эквивалент'_, но я бы сказал '* (ptr [2]). Member1' (там нет поля' id', введенного в любом месте). Что касается преимуществ использования стандартных контейнеров, это четко написано в ответе. –

1

Вы можете добавить объекты в массив по ptr[i] = new items(). И вы можете получить доступ к данным в items** ptr по ptr[i]->member1. Но я настоятельно рекомендую использовать stl-контейнеры и интеллектуальные указатели.

0

Во-первых, вам необходимо завершить шаг распределения.

for(int i=0;i<N;i++) 
    ptr[i]=new items; 

Затем вы можете получить доступ к массиву, используя, например:

ptr[0]->member1=123; 
Смежные вопросы