템플릿 클래스 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에서 생성자 위임을 사용하거나이 초기화를 수행하는 멤버 함수 (도우미)를 사용할 수 있습니다. – dyp
할당하고있는 메모리에 유용한 것을 만들고 싶다면, 소스 타입의 객체로 할 생성자 2는 무엇인가? – Praetorian
당신은 그 생성자에서'c2.val'의 원소의 복사본을 수행하려고합니까? – dyp