EC++ Noncopyable 클래스에 관한 질문입니다.

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
moonhalo
Posts: 146
Joined: 2006-03-28 10:15

EC++ Noncopyable 클래스에 관한 질문입니다.

Post by moonhalo »

유니크해야하는 클래스에 사용하려고

EC++에 소개된 Noncopyable 클래스를 만들어 쓰려고 합니다.

그런데, 이 클래스를 상속 받아도 사용자(프로그래머)가

의도적으로 복사 방지를 피해갈 수 있더군요.

Code: Select all

 // 복사 방지 기반 클래스
class CNoncopyable
{
public:
	// 기본 생성과 소멸은 제공
	CNoncopyable()	{ }
	~CNoncopyable()	{ }

private:
	// 복사 생성과 대입 연산은 구현 안함
	CNoncopyable( const CNoncopyable & a );
	const CNoncopyable& operator = ( const CNoncopyable& a );
};

Code: Select all

// 복사되면 안되는 클래스
class CNode : private CNoncopyable
{
public:
	CNode() { }
	// 복사 생성자에서 부모의 복사 생성자를 호출하지 않는다.
	CNode( const CNode &a ) { }
	// 대입 연산자에서 부모의 대입 연산자를 호출하지 않는다.
	const CNode& operator=( const CNode & a )
	{
		return *this;
	}

public:
	int nData;
};
위처럼 자식 클래스에서 부모 클래스의 복사 함수를 의도적으로 호출하지 않으면

문제 없이 복사 함수 안으로 들어갈 수 있는데...

뭔가 잘못 구현한걸까요?

Code: Select all

void main()
{
	CNode a, b;
	a = b;		// 문제 없다.
	CNode c(a);	// 문제 없다.
}
위는 테스트 코드 입니다.
조프
Posts: 115
Joined: 2005-02-21 02:01
Contact:

Post by 조프 »

Noncopiable 클래스의 의도는 복사하면 안되는 클래스의 복사생성자와 대입연산자를 직접 선언할 필요 없이, Noncopiable 클래스를 상속받아서 깨끗하게 처리하라는 겁니다.

장점은 2가지인데.
1. 상속 받은 클래스에서는 복사 생성자와 대입연산자를 선언할 필요가 없다는 겁니다.
2. 클래스에서 직접 선언을 하면 어떤 상황에 쓰이냐에 따라서 컴파일 에러가 날 수도 있고, 링크 에러가 날 수도 있었던 거 같습니다. 하지만 상속 받아서 처리하면 항상 컴파일 에러가 납니다.
왜 그러냐면 프로그래머가 상속받은 클래스의 복사 생성자와 대입연산자를 선언/구현하지 않고 해당하는 일을 하려고 할 때 컴파일러에서 자동으로 만들어주는 복사 생성자와 대입연산자를 사용하는데, 이 경우에는 부모 클래스의 복사 생성자와 대입연산자를 자동으로 불러주기 때문입니다.

즉 Noncopiable 클래스는 어떤 클래스를 만들 때 복사를 막고 싶으면 직접 선언하지 말고, Noncopiable 클래스를 상속받으라는 것이죠.

새로 복사 생성자와 대입연산자를 만들어서 부모 클래스의 복사 생성자와 대입연산자를 가려버리면 Noncopiable 클래스는 아무 일도 할 수 없는게 당연합니다.
moonhalo
Posts: 146
Joined: 2006-03-28 10:15

Post by moonhalo »

답변 감사합니다.
개념이 그렇게 되는 거군요. ^^
그래도, 확실히 막을 수 없다는게 아쉽기도 하고 좀 불안하네요. ㅎㅎ
Locked