Вектор C stl для классов с закрытым конструктором копирования?

#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 не сможет гарантировать согласованность при перераспределении буфера и может предпочесть конструктор копирования вместо этого.