2014-07-29 2 views
2

В конструкторе копирования struct/class, как я могу избежать копирования всех базовых (int, и т.д.) элементов один за другим, если намерение состоит в том, чтобы скопировать указатель успешно? Можно ли расширить конструктор копии по умолчанию в этом смысле?Расширение конструктора копирования по умолчанию

struct Type 
{ 
    int a; 
    double b; 
    bool c; 
    // ... a lot of basic members 
    int* p; 

    Type() 
    { 
     p = new int; 
     *p = 0; 
    } 

    Type (const Type& t) 
    { 
     // how to avoid copying these members one by one 
     this.a = t.a; 
     this.b = t.b; 
     this.c = t.c; 

     // but only add this portion 
     this.p = new int; 
     *this.p = *t.p; 
    } 
}; 
+10

Используйте умный указатель для 'p' и полностью избавитесь от конструктора копирования. – chris

+0

@ DieterLücking, вы правы. Он не должен использовать оператор присваивания по умолчанию. –

+1

@chris Умный указатель несет ответственность только за освобождение ресурсов, а не за их приобретение. Конструктор копирования должен получить ресурсы. – dyp

ответ

4

Создать RAII оболочку для элемента int * данных, что позволяет копирование/перемещение.

struct DynInt 
{ 
    std::unique_ptr<int> p; 

    DynInt() : DynInt(0) {} 
    explicit DynInt(int i) : p(new int(i)) {} 
    DynInt(DynInt const &other) : p(new int(*other.p)) {} 
    DynInt& operator=(DynInt const& other) 
    { 
     *p = *other.p; 
     return *this; 
    } 
    DynInt(DynInt&&) = default; 
    DynInt& operator=(DynInt&&) = default; 

    // maybe define operator* to allow direct access to *p 
}; 

Затем объявить класс как

struct Type 
{ 
    int a; 
    double b; 
    bool c; 
    // ... a lot of basic members 
    DynInt p; 
}; 

Теперь, неявно создается конструктор копирования будет делать правильные вещи.

+0

Если 'DynInt (int)' ctor неявно, возможно, добавьте 'operator int()' для 'симметрии'. – dyp

+0

@dyp Я думаю, что я предпочитаю явный конструктор. Спасибо, что заметили это. – Praetorian

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