При создании шаблонного класса, включающего динамический массив, я всегда писал специальный конструктор копирования, перегруженный оператор присваивания и деструктор.Я сделал то же самое при создании класса шаблона со связанным списком.Сейчас я делаю шаблонный класс, который использует динамический массив и связанный список.Теперь мне нужно сделать 2 конструктора копирования, 2 перегруженных оператора присваивания и 2 деструктора?Или я могу сделать по одному для каждого случая?На данный момент у меня есть только 1 из каждого, и я не получаю никаких ошибок.Я просто хочу быть уверен, что это не вызовет проблем в будущем.
Конструктор копирования
template<class T>
Board<T>::Board(const Board<T> &otherBoard) {
//for copying linked list..do I need??
//start empty
firstP = NULL;
//copy list from other list
append(otherBoard);
//allocate 1st and copy 1st
grid = new T*[BOARDSIZE];
for (int i = 0; i < BOARDSIZE; i++)
grid[i] = new T[BOARDSIZE];
//allocate 2nd and copy 2nd
for (int i = 0; i < BOARDSIZE; i++)
for (int j = 0; j < BOARDSIZE; j++)
grid[i][j] = otherBoard.grid[i][j];
}
Оператор присваивания
//Assignment
template<class T>
Board<T> &Board<T>::operator=(const Board<T> &otherBoard) {
//check for self-assignment
if (this != &otherBoard) {
//for assigning linked list...do i need?
//Remove all current nodes and reset the pointer
clear();
//copy from other board
append(otherBoard);
//deallocate old array
for (int i = 0; i < BOARDSIZE; i++)
delete[] grid[i];
delete grid;
//allocate and copy
for (int i = 0; i < BOARDSIZE; i++)
grid[i] = new T[BOARDSIZE];
for (int i = 0; i < BOARDSIZE; i++)
for (int j = 0; j < BOARDSIZE; j++)
grid[i][j] = otherBoard.grid[i][j];
}
//return self
return *this;
}
Деструктор
template<class T>
Board<T>::~Board() {
//for linked list...do i need?
clear();
//deallocate
for (int i = 0; i < BOARDSIZE; i++)
delete[] grid[i];
delete[] grid;
}