예를 들어서 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();
#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();
댓글 없음:
댓글 쓰기