#c #vector #private #copy-constructor #assignment-operator
#c #вектор #Частное #copy-constructor #оператор присваивания
Вопрос:
В нашем коде есть класс, скажем, class C
. Я хочу создать вектор объектов класса C
. Однако и конструктор копирования, и оператор присваивания намеренно объявлены равными private
. Я не хочу (и, возможно, мне не разрешено) это изменять.
Есть ли какой-либо другой чистый способ использовать / определить vector<C>
?
Ответ №1:
Вместо этого вы могли бы использовать vector<C*>
или vector<shared_ptr<C>>
.
Ответ №2:
Нет, это не так, std::vector
требуется присваиваемая концепция. У авторов C, должно быть, была веская причина запретить это, вы должны придерживаться всего, что они предоставляют для копирования / назначения экземпляров C
. Либо вы используете указатели, как предложено выше, или C
предоставляет другой механизм для копирования / присвоения самого себя. В последнем случае вы могли бы написать назначаемый тип прокси для C
.
Ответ №3:
У вас есть доступ к библиотеке boost?
Создайте вектор повышающих общих указателей.
std::vector<boost:shared_ptr<C>>
Ответ №4:
Мне удалось сделать это, используя всего двух друзей:
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
friend class std::vector;
template<typename _T1, typename _T2>
friend void std::_Construct(_T1* __p, const _T2amp; __value);
Поместите их в объявление вашего класса и вуаля!
Я использую gcc 5.3.1.
Ответ №5:
Здесь вы можете использовать конструктор перемещения.
#include<iostream>
#include<vector>
class Road
{
Road(const Roadamp; obj){} //copy constructor
Roadamp; operator=(const Roadamp; obj){ return *this; } //copy assignment
public:
/*May use below commented code as well
Road(const Roadamp;)=delete;
Roadamp; operator=(const Roadamp;)=delete;
*/
Road()=default; //default constructor
Road(Roadamp;amp; obj){} //move constructor
void display(){ std::cout<<"Object from myvec!n"; }
};
int main()
{
std::vector<Road> myVec;
Road obj;
myVec.push_back(std::move(obj));
myVec[0].display();
return 0;
}
Комментарии:
1. У вас неправильная семантика конструктора перемещения. Бессмысленно переходить от объекта const.
2. Спасибо @DmitryKuzminov за указание. Я имею в виду также достичь цели с помощью конструктора перемещения. Я удалил const из конструктора перемещения.
3. Еще одна проблема: конструктор перемещения не должен вызывать исключений (должен быть
noexcept
). В противном случае vector не сможет гарантировать согласованность при перераспределении буфера и может предпочесть конструктор копирования вместо этого.