избегая неявного копирования с отключенным конструктором копирования - PullRequest
2 голосов
/ 22 января 2012

Предположим, у вас есть класс NonCopyable

class NonCopyable
{
public:
   NonCopyable(int n){}
   ~NonCopyable(){}
   [...]

private:
   [members...]

private:
   NonCopyable( const NonCopyable& ); //disabled (no definition)
   NonCopyable& operator= ( const NonCopyable& ); //disabled (no definition)
};

Для этого класса нелогично иметь его копии, поэтому конструктор копирования и оператор присваивания отключены.

Однако, когда вынужен вектор объектов NonCopyables:

std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable(n));

Здесь вы неявно вызываете конструктор копирования.

Меня учили решать эту проблему, используя указатели на эти объекты вместо объектовсамих себя.Но это раздражает как в использовании, так и в производительности, потому что вы должны динамически распределять эти объекты с помощью new () ...

Мой вопрос: есть ли способ обойти это?Какое общее решение этой проблемы?

Ответы [ 2 ]

4 голосов
/ 22 января 2012

C ++ 11 имеет решение, которое применяется ко многим не копируемым классам: сделать класс подвижным (а не копируемым) и использовать emplace_back для добавления новых элементов в вектор.

Если вам нужно что-то выдумать с помощью C ++ 03, возможно, вы сможете найти способ реализовать копирование «пустых» объектов NonCopyable (и использовать идею Лучиана об ограничении этой операции), а также найти способ реализовать swap. Тогда вы можете сделать:

std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable());
NonCopyable(n).swap(m_V.back());
1 голос
/ 22 января 2012

Вы можете сделать vector другом класса:

class NonCopyable
{
   friend std::vector<NonCopyable>;
public:
   NonCopyable(int n){}
   ~NonCopyable(){}

private:
   NonCopyable( const NonCopyable& ) {}; 
   NonCopyable& operator= ( const NonCopyable& ) {}; 
};

или у вас может быть vector умных указателей на класс.

РЕДАКТИРОВАТЬ:

Возможно, я неправильно понял вопрос.Если вы не хотите, чтобы копии класса (мое первоначальное предположение состояло в том, что вы не хотите, чтобы копии были общедоступными), вам определенно следует использовать умные указатели.

...