2010-02-03 5 views
1

나는 희소 행렬 클래스를 작성 중이다. 그 내용을위한 템플릿이 될 노드 클래스가 필요합니다. 이 수업을 작성할 때의 내 문제는 다음과 같습니다.값으로 컨테이너 클래스에 복사하는 방법?

내용을 어떻게 저장합니까?

값으로 내용을 저장하고 싶습니다. 포인터로 저장하고 파손해야한다면 문제가 생길 수 있습니다. 어떻게하면 setContents 메서드에서 안전하게 복사본을 수행 할 수 있습니까? C++은 내 노드 컨테이너에 배치해야하는 클래스가 자신을 복제 할 수 있다는 보장을 제공합니까?

복사 생성자를 살펴 보았지만 약간의 불안감이 있습니다. 포함 된 클래스가 복사 생성자를 구현하지 않으면 어떻게됩니까? 그런 다음 참조로 노드에 전달하는 것은 현명하지 않습니다. 원래 개체를 삭제하거나 범위를 벗어나는 경우 매달린 참조로 이어질 수 있기 때문입니다.

일종의 "표준 C++"방법은 무엇입니까?

+1

사용자 제공 메서드 (복사 생성자 또는 복제본)에 대한 호출로 인해 예외가 throw 될 수 있으므로주의하십시오. try/catch로 코드를 혼란시켜야 함을 의미하는 것은 아니지만,이 가능성을 인식하고 행동을 명령해야 컨테이너가 일관성없는 상태로 남을 수 있습니다. 당신이 고려해야 할 유일한 방법은 '파괴자'입니다. 누구든지 파괴자를 던질만큼 어리석은 사람은 당신의 연민에 합당하지 않습니다. –

답변

3

표준 C++ 접근법은 컨테이너 클래스에서 사용되는 유형을 복사 가능해야하며 지정 가능해야한다는 것을 명심해야합니다. 매우 합리적인 요구 사항이며 표준 라이브러리의 모든 컨테이너 클래스 템플릿에서 사용됩니다.

내장형 및 간단한 POD 유형의 경우 사용자가 선언 한 복사 생성자는 일반적으로 필요하지 않습니다. 단순하지는 않지만 가치있는 sematics를 필요로하는 클래스의 작가는 일반적으로 적합한 복사 생성자를 제공해야합니다.

1

나는 희소 행렬 클래스를 작성 중이다. 그 내용을위한 템플릿이 될 노드 클래스가 필요합니다.

템플릿 구현에서 노드를 복사하면 노드를 복사 할 수 있어야합니다. 누군가가 공용 복사 생성자가없는 클래스로 템플릿을 인스턴스화하려고하면 컴파일러 오류가 발생합니다.

템플릿을 인스턴스화 할 때 컴파일러는 템플릿을 인스턴스화하는 데 사용되는 유형에 대해 사용 된 모든 메소드 /가 사용 가능한지 확인합니다. 따라서 템플릿을 사용하는 모든 클래스는 공용 복사본 생성자를 갖게됩니다.

공용 복사 생성자를 사용하는 것도 합당한 요구 사항입니다. 표준 라이브러리의 컨테이너는 또한 요소를 복사 할 것을 요구합니다. 또한 사용자 정의 클래스가 정의되어 있지 않으면 컴파일러는 새로운 유형의 복사 생성자를 자동으로 생성하므로 대부분의 클래스에는 사용할 수있는 복사 생성자가 있습니다.

그럼에도 불구하고 템플릿의 사용자는 템플릿의 사용자가이를 인식 할 수 있도록 일반적인 의미론을 사용하여 노드를 복사해야한다고 문서화해야합니다.

0

제 업계에서는 BOOST 라이브러리가 매우 유명 해졌습니다. Boost.org

부스트에는 스마트 포인터라는 클래스가 있습니다. 기본적으로 참조 카운트를 구현하는 포인터에 대한 래퍼 클래스입니다. 아무도 포인터를 지켜 보지 않으면 스마트 포인터는 자체를 삭제합니다. 매달린 참조, 메모리 누수 등의 많은 문제를 해결합니다.

또 다른 옵션으로 단순히 더 나은 복사본 생성자를 구현하는 것이 좋습니다.템플릿을 작성하고있는 클래스가 custom이 아니고 더 이상 라이브러리에 프로그램을 추가하지 않으려면 더 나은 복사 생성자가있는 클래스에 대해 항상 래퍼 클래스를 작성할 수 있습니다. 기본 복사 생성자.