У меня есть класс test
, который не является стандартным или назначаемым по определенным причинам. Однако он является копируемым - он может говорить, что ведет себя немного как ссылка.
К сожалению, мне понадобился динамический массив этих элементов, и я понял, что vector<test>
- неправильный выбор, потому что элементы вектора должны быть стандартно конструируемыми и назначаемыми. К счастью, я справился с этой проблемой
- с использованием
vector<T>::reserve
и vector<T>::push_back
вместо vector<T>::resize
и прямым заполнением записей (без стандартной конструкции)
трюк copy'n'swap для присваивания и тот факт, что vector
обычно реализуется с использованием Pimpl-идиомы (нет прямого присваивания существующего элемента test
), т.е.
class base {
private:
std::vector<test> vect;
/* ... */
public:
/* ... */
base& operator= (base y) {
swap(y);
return *this;
}
void swap(base& y) {
using std::swap;
swap(vect, y.vect);
}
/* ... */
};
Теперь я предполагаю, что я, вероятно, не учитывал каждый крошечный бит и, кроме того, все эти уловки сильно зависят от реализации. Стандарт гарантирует стандартное поведение только для стандартных конструируемых и присваиваемых типов.
Теперь, что дальше? Как я могу получить динамический массив из test
объектов?
Примечание: Я должен предпочесть встроенные решения и классы, предусмотренные стандартом C ++.
Редактировать: Я только что понял, что мои трюки на самом деле не сработали. Если я определяю действительно * не присваиваемый класс, я получаю много ошибок на моем компиляторе. Таким образом, вопрос сводится к последнему вопросу: Как мне получить динамический массив этих test
объектов?
(*) Мой класс test
предоставил оператор присваивания, но этот работал как присвоение ссылки.