Post List

2014년 12월 25일 목요일

복사할 수 없는 Class의 복사

MFC 기본 Class들의 경우 복사가 불가능한 Class들이 있다.
예를 들어서 CBitmap, CCriticalSection 등....
그래서 위의 객체들을 vector, deque 와 같은 Collection에 넣을 경우나
위의 객체를 포함한 Class를 대입하거나 Collection에 넣을 경우 아래와 같은 에러가 발생한다.

error C2248: 'CObject::CObject' : private 멤버('CObject' 클래스에서 선언)에 액세스할 수  없습니다.

이럴 경우 shared_ptr을 사용하면 해결 된다.
shared_ptr에 대한 자세한 글은 아래 링크를 참조바란다.

http://devluna.blogspot.kr/2014/12/stl-sharedptr-weakptr.html

간단히 예제를 보면 이해가 될것이다.

#include <memory>
#include <vector>

class CSPCriticalSection
{
public:
    CSPCriticalSection()
    {
        std::tr1::shared_ptr<CCriticalSection> c(new CCriticalSection());
        m_CS = c;
    }
    ~CSPCriticalSection();
    std::tr1::shared_ptr<CCriticalSection> m_CS;
};

std::vector<CSPCriticalSection> list;

// CObject를 상속받은 객체나 그것을 포함한 Class를 넣는 Collection의 경우 resize(), push_back() 등의 함수실행시 위의 오류 발생
list.push_back(new CSPCriticalSection());

// 사용은 아래와 같이 한단계를 더 적어야 해서 조금 불편한건 사실
list[0].m_CS->Lock();

댓글 없음:

댓글 쓰기