2016-10-06 3 views
1

Я работаю над создателем и оператором присваивания для интеллектуального массива с использованием переменной ptr_, которая указывает на первый элемент массива и size_, который указывает на последний элемент массива. Я надеялся изменить свой старый проект, чтобы преобразовать его в ptr_ типа signed char* вместо ptr_ с typename T*, но я не уверен, как это сделать. Вот что у меня есть для оператора присваивания и конструктор копирования:Как создать оператор присваивания и конструктор копирования, используя глубокую копию?

template <typename T> class smart_array{ 
public: 
//copy constructor 
smart_array(const smart_array& A) : size_(A.size_{ 
    if (size_ == 0) ptr_= nullptr; 
    else{ 
     ptr_=new T[size_]; 
    std::copy(A.ptr_, A.ptr_+ size_, ptr_); 
    } 
} 


//Assignment operator 
smart_array& operator = (const smart_array& A) { 
    if (this == &A) return *this; 
    delete[ptr_]; 
    size_ = A.size_; 
    if (size_==0) ptr_ = 0; 
    else{ 
     ptr_ = new T[size_]; 
     std::copy(A.ptr_, A.ptr_ + size_, ptr_) 
    } 
    return *this; 
} 

private: 
    int size_; 
    T* ptr_; 
// Want ptr_ to be signed char* type 
+1

Почему бы не просто использовать 'std :: vector'? –

+1

Почему бы просто не создать экземпляр шаблона с помощью 'T = signed char'? Я не понимаю, почему вы хотите «конвертировать» код – user463035818

+0

Делает ли 'size_' количество байтов или элементов? Если 'ptr_' будет считаться с' char * 'и' size_' (как показывает ваш код), это приведет к ошибкам очень быстро. – Guvante

ответ

0

вам придется исправить некоторые опечатка, но как специализировать шаблон, чтобы сделать указатель типа «подписанный символ *».

smart_array<signed char> MySmartArray1; 
smart_array<signed char> MySmartArray2 = MySmartArray1; 

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

smart_array() : size_(0), ptr_(nullptr) { 
} 
+0

Это не имеет смысла ... ваш код является объявлением функции. Я предполагаю, что вы имели в виду нечто вроде 'smart_array MySmartArray;', но это не связано с специализацией. Специализация - это когда другому телу присваивается функция шаблона для определенного экземпляра. –

+0

Спасибо. Я внесла поправки в свой ответ. – Gregg

+0

Наборы шаблонов являются SFINAE'd в выбранный корпус шаблона (для этой ссылки), тела шаблонов специализированы для классов (если это шаблон шаблона), а классы создаются в объекты. SFINAE означает, что ошибка замещения не является ошибкой и позволяет компилятору просто удалить шаблон из набора перегрузки, если его пробная компиляция выдает ошибку. Компилятор выбирает и специализирует шаблон из набора перегрузки, который наилучшим образом соответствует данным аргументам. – Gregg

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