2013-12-07 18 views
-1

У меня есть класс под названием «Кара», и у меня есть этот атрибут в другом классе: Cara** caras;. caras представляет собой массив указателей на объект типа «Кара».Объявление динамического массива указателей

Я не знаю, как я могу объявить этот атрибут. Вы можете мне помочь?

+0

Я не уверен на 100%, что вы просите. Если бы вы могли предоставить какой-то код вместе с любыми ошибками или неожиданным поведением, которое получилось бы, это помогло бы. – godel9

+0

Если я это сделаю: * cara = new Cara [numCaras]; Для аффилиации атрибута «caras», хорошо? – own3dh2so4

+0

Вы уверены, что хотите «массив указателей в карасах», а не «указатель на массив caras»? Ваше объявление «Cara ** caras» указывает на прежнее, но «новый Cara [n]» доставит вам последнее. В любом случае вы не можете назначить это '* caras', если сам« caras »не был инициализирован. Ниже приведены ответы на вопрос о том, как выделить массив указателей Cara, или, еще лучше, использовать классы STL, такие как 'vector'. – jez

ответ

1

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

class Cara; // this is called a "forward declaration" 

и что позволяет обращаться к нему:

class Bob { Cara ** caras; }; 

еще до того, как вы определили его:

class Cara { int foo; }; 
+0

Моя проблема в том, что я не знаю, как инициализировать атрибут Cara ** caras – own3dh2so4

+0

В некотором методе 'Bob' вы можете сказать' caras = new Cara * [20]; ', что делает пространство для 20 указателей Cara. Тогда вы можете сказать «caras [0] = new Cara();» для инициализации первого из этих указателей - или, конечно же, вы можете просто назначить уже известный указатель на кару в этот слот. И так далее для других слотов. Помните, что, когда вы закончили использовать объекты, вы должны «удалить» каждый из 'cara [i]', который вы выделили с помощью 'new', и, наконец,' delete [] caras', иначе у вас будет память утечки. – jez

+0

Спасибо. Проблема решена – own3dh2so4

1

Если вы пытаетесь выделить массив указателей на объекты типа Cara, вы можете использовать:

Cara **caras = new Cara *[numElements]; 

Если после этого вы хотите, чтобы выделить Cara сами объекты, вы можете использовать:

for(int i = 0; i < numElements; ++i) 
    caras[i] = new Cara; 
+0

Кстати, я согласен с @ThomasMatthews, что вы должны использовать 'std :: vector', если вы уже используете C++. – godel9

1

предпочитают не использовать массивы, но std::vector.

С std::vector:

class Cara; 

std::vector<Cara *> my_vector_of_pointers; 

//... 
for (i = 0; i < 10; ++i) 
{ 
    my_vector_of_pointers.push_back(new Cara); 
} 

Если вы должны использовать массивы:

#define ARRAY_CAPACITY 10 
Cara * my_array_of_pointers[ARRAY_CAPACITY]; 

В другой записке, предпочитают использовать смарт-указатели, а не регулярные указатели. Найдите в Интернете «boost smart_ptr» или «boost shared_ptr».

+0

Почему не 'const int ARRAY_CAPACITY = 10' вместо' # define'? –

+0

@ Mhd.Tahawi: Извините, старая привычка. Должен также работать 'const int ARRAY_CAPACITY = 10'. –

Смежные вопросы