Предположим, у вас есть класс 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()...
Мой вопрос: есть ли способ обойти это? Какое обычное решение этой проблемы?
vector
в C++03 имеет досадное и несущественное ограничение, заключающееся в том, что единственный способ получить в него объекты - это скопировать их туда. xcrypt не нуждается в копиях объектов:vector
— это удобный способ управлять памятью числом объектов, зависящим от времени выполнения, но в C++03 это не так удобно, как в C++ 11. - person Steve Jessop   schedule 22.01.2012