C++

복사 불가능한 클래스 속성 만들기 noncopyable

Elan 2022. 11. 1. 17:56

class를 복사가 불가능하게 하려면 어떻게 해야할까?


당연히 복사 생성자와, 복사 대입 할당 연산자를 delete하면 된다.



그렇다면 복사 불가능한 class를 상속받은 class들도 당연히 복사가 불가능해 질 것이다.



boost asio라이브러리 중 boost::asio::streambuf 라는 스트림 버퍼가 있다.

열어보면 noncopyable이라는 클래스를 private로 상속받고 있다.

Boost asio에서 사용하는 상속을 이용한 방식

namespace boost {
namespace asio {

/// Typedef for the typical usage of basic_streambuf.
typedef basic_streambuf<> streambuf;

} // namespace asio
} // namespace boost

...

template <typename Allocator>
class basic_streambuf
  : public std::streambuf,
    private noncopyable
{
public:
....
}

...

class noncopyable
{
protected:
  noncopyable() {}
  ~noncopyable() {}
private:
  noncopyable(const noncopyable&);
  const noncopyable& operator=(const noncopyable&);
};

noncopyable이라는 클래스를 살펴보면 생성자가 protected이고,

'복사 생성자''복사 대입 생성자'가 private으로 되어있는 것을 볼 수 있다.

이것을 이용하면 타입 제약같은 template 문법을 사용할 수 있다.

예를 들면 is_noncopyable<T> 같은것들을 말한다.

 

Unreal Engine에서는 아래와 같이 매크로를 사용하여 표시하고 UnrealBuildTool을 이용하여 제약을 건다.

#define UE_NONCOPYABLE(TypeName) \
	TypeName(TypeName&&) = delete; \
	TypeName(const TypeName&) = delete; \
	TypeName& operator=(const TypeName&) = delete; \
	TypeName& operator=(TypeName&&) = delete;
    
    
...


class COREUOBJECT_API FFieldClass
{
	UE_NONCOPYABLE(FFieldClass);

...

}