2012-06-29 7 views
1

Я буду использовать std::map<int, A>Могу ли я предотвратить конструктор копирования с некоторым исключением?

A класс, и я должен предотвратить неполную копию, но есть много классов, как A, так что делают глубокое копирование конструкции и оператор утомительно. Поскольку кажется, что мне не нужно использовать конструктор копирования и оператор присваивания копии, Я решил не использовать их.

Чтобы предотвратить некоторые ошибки, я создал класс UnCopyable, у которого есть собственный экземпляр constuctor и оператор присваивания копий, и A унаследовал его.

Однако есть одна проблема. std::map используйте конструктор копирования.

Я не хочу, чтобы спрятать указатель A на карте.

Какое лучшее решение?

+0

Почему это невозможно для копирования? Потому что у кого-то есть указатель на него или просто потому, что надлежащая копия должна быть глубокой? Вы можете подумать о реализации семантики «move» в конструкторе копирования, если знаете, что он будет только когда-либо скопирован из временного. – Potatoswatter

+0

Я решил эту проблему, используя класс handle. –

ответ

1

Вы можете использовать умный указатель, например std::shared_ptr, или написать прокси-класс.

Например:

class Foo { 
public: 
    std::string name() const; 
}; 

typedef std::shared_ptr<Foo> SharedFoo; 

или

class SharedFoo { 
public: 
    std::string name() const { return instance->name(); } 
private: 
    std::shared_ptr<Foo> instance; 
}; 
3

Вы могли бы думать о попытке C++ 11, который имеет несколько решений проблемы такого рода: std::map::emplace исключающего Copyable требование A , и std::move, который позволяет переносить один объект в другой без копирования.

Кроме того, есть новый, более явным образом определить класс как не копируемыми:

A(A const &) = delete; 

Это хорошее время, чтобы обновить C++ компилятор.

 Смежные вопросы

  • Нет связанных вопросов^_^