2010-05-05 3 views
2

다음 코드는 MSVC2005에 나를 위해 컴파일되지 않습니다 :STL 컨테이너에서 MFC 개체를 사용할 수 있습니까?

std::vector<CMenu> vec(10); 

CMenu (예 : 상황에 맞는 메뉴 등) MFC 메뉴 객체입니다. 일부 테스트를 통해 CMenu에는 공용 복사본 생성자가 없다는 것을 알게되었습니다.

내가하고 싶은 일을하려면 동적 배열을 사용해야했습니다.

물론 이제는 STL 컨테이너를 사용할 때의 모든 이점을 잃어 버렸습니다.

다른 옵션이 있습니까?

답변

6

pointer containers 또는 스마트 포인터 컨테이너를 사용할 수 있습니다. 부스트 또는 TR1에서 shared_ptr을 사용 :

std::vector<shared_ptr<CMenu> > vec; 
vec.push_back(make_shared<CMenu>()); 
0

당신은 용기가 파괴 될 때 자동으로 delete D입니다 힙 할당 한 어떤 오브젝트를 가리키는 포인터를 저장하는 스마트 포인터와 함께 STL 컨테이너를 사용할 수 있습니다.

이 작품의 정확한 스마트 포인터는 boost::shared_ptr입니다.

자세한 내용은 this question을 참조하십시오.

1

MFC 개체는 Windows 핸들 주위의 간단한 래퍼이며 대부분 소멸자에서 핸들을 릴리스하도록 설계되었습니다. 그 때문에 복사 생성자를 가지는 것은 위험합니다. 왜냐하면 처음으로 파괴 된 것은 다른 하나를 무효화 할 것이기 때문입니다.

컨테이너가 핸들을 대신 잡고, MFC 랜드로 다시 변환해야 할 때마다 FromHandle을 사용하십시오.

+0

더 똑똑한 디자인은'shared_ptr <>'과 비슷하게 구현했을 것입니다. 복사본을 만들면 동일한 메뉴를 참조하며 해당 소멸자는 마지막 소멸자에서 삭제되어야합니다. gf의 anwer는 대신 shared_ptr에 CMenu를 래핑하여 동일한 결과를 얻습니다. – MSalters

+0

아무도 MFC의 디자인이 똑똑하다고 주장하지 않았습니다. Microsoft와 함께하고 싶습니까? 그렇지 않아도됩니까? –

관련 문제