Как написать конструктор копирования класса Template - PullRequest
6 голосов
/ 03 октября 2011

Как написать конструктор копирования для шаблона класса.Так что, если параметр шаблона - это другой определенный пользователем класс, его конструктор копирования также вызывается.

Ниже приведен мой класс

template <typename _TyV>
class Vertex {
public:
    Vertex(_TyV in) :   m_Label(in){ }
    ~Vertex() { }
    bool operator < ( const Vertex & right) const {
        return m_Label < right.m_Label;
    }

    bool operator == ( const Vertex & right ) const {
        return m_Label == right.m_Label;
    }

    friend std::ostream& operator << (std::ostream& os, const Vertex& vertex) {
        return os << vertex.m_Label;    
    }

    _TyV getLabel() { return m_Label;}
private:
    _TyV m_Label;
public:
    VertexColor m_Color;
protected:
};

Ответы [ 3 ]

4 голосов
/ 03 октября 2011

Либо а) совсем нет, просто положитесь на компилятор по умолчанию; или б) просто вызвав конструктор копирования члена:

template <typename T> struct Foo
{
  T var;
  Foo(const Foo & rhs) : var(rhs.var) { }
};

Дело, конечно, в том, что предоставленный компилятором конструктор копирования по умолчанию делает точно то же самое: он вызывает конструктор копирования каждого члена по одному. Поэтому для класса, состоящего из умных объектов-членов, конструктор копирования по умолчанию должен быть наилучшим из возможных.

3 голосов
/ 03 октября 2011

Предполагается, что _TyV является типом значения:

Vertex( Vertex const& src )
    : m_Label( src.m_Label )
{}

Кстати, не являются ли эти имена в экземплярах классов зарезервированными реализацией?

Стандарт C ++резервирует набор имен для использования реализацией C ++ и стандартными библиотеками [стандарт C ++ 17.6.3.3 - Зарезервированные имена].Они включают, но не ограничиваются:

  • Имена, содержащие двойное подчеркивание.
  • Имена, начинающиеся с подчеркивания, за которым следует заглавная буква.
  • Имена, начинающиеся сс подчеркиванием в глобальном пространстве имен.
2 голосов
/ 03 октября 2011
template <typename T>
class Vertex {
public:

    //this is copy-constructor
    Vertex(const Vertex<T> &other) 
          : m_Color(other.m_Color),m_Label(other.m_Label)
    {
      //..
    }
    //..
};

Но я не думаю, что вам нужно явно определять конструктор копирования, если только класс не имеет указатель данных члена и вы не хотите делать глубокое копирование объектов.Если у вас нет указателя данных члена, тогда будет достаточно конструктора копирования по умолчанию, сгенерированного компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...