C ++ - Что на самом деле означает эта структура двойного указателя / массива?У меня проблемы с изображением - PullRequest
1 голос
/ 07 февраля 2011

Это в коде C ++

YInterface ** Y_list;

int numberofYInterfaces;

тогда

numberofYInterfaces=1;

Y_list = new YInterface *[numberofYInterfaces];        //What ??????

Мне очень тяжело представить структуру Y_list? А потом представьте мое замешательство, когда и если число Интерфейсов станет больше одного, даже 2?

OOPS извините, и я забыл написать следующее заявление:

Y_list[i]= new AnotherClass();

// позднее дополнение к моему оригинальному вопросу. Спасибо за внимание Эрика Фортина. Примечание. AnotherClass наследуется от YInterface.

Любая помощь приветствуется

Ответы [ 4 ]

12 голосов
/ 07 февраля 2011

Когда вы объявляете Y_list, вы получаете единственную переменную с неопределенным значением в ней:

Y_list
+-------+
|       |
+-------+

Когда вы присваиваете ей new[], она указывает на то, что new[] выделено, чтов данном случае это массив указателей:

Y_list         array
+-------+     +-------+
|   o---+---->|       |
+-------+     +-------+
              |       |
              +-------+
              |       |
              +-------+
              |       |
              +-------+
              |       |
              +-------+

На данный момент у вас еще нет объектов YInterface.У вас просто есть место, предназначенное для хранения указателей , если они когда-либо существуют.

Наконец, вы присваиваете значение одному из элементов Y_list[i] = new AnotherClass.Это когда YInterface потомок существует, но у вас пока есть только один.Запустите этот код в цикле, и вы получите несколько экземпляров.Но у вас все еще есть только один массив и один указатель на этот массив.

Y_list         array         AnotherClass
+-------+     +-------+     +-------+
|   o---+---->|   o---+---->|       |
+-------+     +-------+     |       |
              |       |     |       |
              +-------+     |       |
              |       |     |       |
              +-------+     +-------+
              |       |
              +-------+
              |       |
              +-------+

Чтобы освободить все это, не забудьте иметь один оператор delete для каждого оператора new и один delete[] за каждый new[]:

delete Y_list[i];

delete[] Y_list;
2 голосов
/ 07 февраля 2011

Y_list указывает на фрагмент памяти, который представляет собой массив указателей на объекты YInterface - каждый указатель имеет размер sizeof (YInterface *), поэтому этот фрагмент памяти (после вызова new) имеет размер numberOfYInterfaces * sizeof (YInterface *).

Таким образом, Y_list - это просто обычный динамически размещаемый массив с элементами numberOfYInterfaces, каждый из которых сам является указателем на объект YInterface.

2 голосов
/ 07 февраля 2011

Это означает, что это динамически размещенный массив указателей на YInterface.Затем предположим, что метод blah является частью YInterface, вы можете получить к нему доступ через массив, например:

Y_list[0]->blah();

Относительно вашего редактирования.Каждый элемент в массиве является указателем на YInterface, поэтому для того, чтобы что-то было указано, вам нужно выделить его, что вы делаете с помощью оператора new.Таким образом, Y_list[i] = new AnotherClass() выделяет объект AnotherClass и сохраняет указатель на этот объект в массиве по индексу i.

Имейте в виду, что AnotherClass должен наследовать YInterface, чтобы это работало.

0 голосов
/ 07 февраля 2011

в массиве c ++ - указатели, то есть адрес памяти первого элемента массива - это имя массива, так что теперь у вас есть массив указателей, поэтому **

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