Простые вопросы CArray - PullRequest
2 голосов
/ 05 мая 2010

1.) В чем разница между

CArray <SomeClass> collection;

и

CArray <SomeClass,SomeClass> collection;

или даже

CArray <SomeClass* ,SomeClass* > collection;

2.) Читая некоторые комментарии к Stackoverflow, я обнаружил заметку «Не используйте CArray». Почему нельзя использовать CArray?

Ответы [ 3 ]

7 голосов
/ 05 мая 2010

Это:

CArray <SomeClass> collection;

эквивалентно этому:

CArray <SomeClass, const SomeClass&> collection;

Второй параметр шаблона используется для указания типа доступа к членам. Параметры шаблона описаны в документации по MSDN .

Это:

CArray <SomeClass* ,SomeClass* > collection;

хранит коллекцию указателей на объекты типа SomeClass, тогда как две другие хранят коллекции объектов типа SomeClass.

Что касается того, почему вы "не должны его использовать", std::vector, который является частью стандарта языка C ++ и, следовательно, переносимым, вероятно, является лучшим выбором для большинства проектов. Если у вас есть устаревший код, который использует CArray, то вам, возможно, придется его использовать, и в этом нет ничего плохого.

0 голосов
/ 20 мая 2015

Разница в том, что хранится в объекте CArray и как оно хранится в объекте, независимо от того, являются ли элементы CArray объектами или указателями на объекты некоторого класса.

CArray, кажется, имеет несколько неожиданных поведений. Это было вокруг в течение долгого времени и было разработано, чтобы вписаться в экосистему МФЦ. Стандартная библиотека шаблонов C ++ vector имеет гораздо более приятные и более общие характеристики, особенно при работе с объектами, отличными от простых типов данных.

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

Одной из проблем при просмотре источника в afxtempl.h является то, что когда CArray увеличивается с помощью внутренней функции SetSize(), функция memcpy_s() используется для копирования CArray элементов из одной области памяти в другой. Поэтому вы должны быть осторожны с указателями и поверхностным копированием элементов CArray. А поскольку используется memcpy_s(), а не memmove_s(), если вы делаете что-то необычное с пересекающимися областями памяти, может возникнуть проблема.

Возможно, поэтому мой опыт использования CArray в качестве контейнера для указателей на объекты, кажется, работает намного лучше.

Интересно то, что, похоже, методы Append() и Copy() используют внутреннюю функцию CopyElements(), которая выполняет присваивание элемента за элементом, а не вызов функции memcpy_s(). Однако эти методы используются с CArray объектами, а не с отдельными элементами.

CArray получено из CObject, что означает, что в структуре данных будет весь багаж CObject. Однако есть и некоторые хорошие вещи, которые CObject приносит в мире MFC, такие как сериализация.

Похоже, вы должны использовать ссылку в качестве второго аргумента шаблона, поэтому вы должны использовать CArray <SomeClass, SomeClass &> collection;, если вы используете класс. Я столкнулся с проблемами, когда не сделал этого, пока не обнаружил раздел Создание списка массивов из Коллекции MFC: класс CArray .

0 голосов
/ 05 мая 2010

2) Поскольку CArray перераспределяет память при добавлении нового элемента.

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