我有一個模板類C.我想要這樣的模板拷貝構造函數,它將根據其他類的大小調整數據數組的大小。用模板拷貝構造函數替換默認拷貝構造函數
以下是一個簡單的例子。它工作正常。但是,請注意,Constructor 2
和Constructor 3
如此相似,我想知道是否可以將它們合併爲一個?
另外,如果我簡單地刪除Constructor 3
,那麼C<int> c3(c1)
將不會調用Constructor 2
,而是調用編譯器添加的默認拷貝構造函數。這將導致內存分配不當。
template<typename T>
class C
{
public:
T* val;
int size;
public:
C(int s = 0) {
cout << "Constructor 1" << endl;
size = s;
val = (size) ? new T[size] : nullptr;
}
template<class T2>
C(const C<T2>& c2) {
cout << "Constructor 2" << endl;
size = c2.size;
val = (size) ? new T[size] : nullptr;
}
C(const C<T>& c2) {
cout << "Constructor 3" << endl;
size = c2.size;
val = (size) ? new T[size] : nullptr;
}
~C() {
cout << "~C()" << endl;
delete[] val;
val = nullptr;
}
};
int main(void)
{
C<int> c1(5);
C<float> c2(c1);
C<int> c3(c1);
return 0;
}
上述功能的輸出:
Constructor 1
Constructor 2
Constructor 3
~C()
~C()
~C()
您可以在C++ 11中使用構造函數委託,也可以使用執行此初始化的成員函數(helper)。 – dyp
假設你想對你正在分配的內存做一些有用的事情,構造函數2將使用來自源類型的對象做什麼? – Praetorian
你打算在這些構造函數中執行'c2.val'元素的副本嗎? – dyp