2010-05-05 6 views
2

1.) В чем разница междуПростые CArray вопросы

CArray <SomeClass> collection; 

и

CArray <SomeClass,SomeClass> collection; 

или даже

CArray <SomeClass* ,SomeClass* > collection; 

?

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

ответ

7

Это:

CArray <SomeClass> collection; 

эквивалентно следующему:

CArray <SomeClass, const SomeClass&> collection; 

Второй параметр шаблон используется для указания типа, через которые осуществляется доступ пользователей. Параметры шаблона are described in the documentation on MSDN.

Это:

CArray <SomeClass* ,SomeClass* > collection; 

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

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

-2

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

+3

and std :: vector? – Andrey

+0

-1: Это не почему. вектор делает то же самое –

0

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

CArray, похоже, имеет несколько неожиданных действий. Он существует уже давно и предназначен для установки в экосистему MFC. Стандартная библиотека шаблонов 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 Collections: The CArray Class.

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