2013-03-04 3 views
3

나는이 배열을 가지고있다. 불행하게도, 컴파일러는 LexedFile 소멸자에 대한 맵 변수의 가시성 규칙으로 인해 이것에 대해 크게 불평합니다. ~LexedFile()을 공개하여이 문제를 해결할 수 있습니다. 물론 내가 개인적으로 만든 이유는 해당 유형의 개체가 Lex 개체에만 속해 있다는 결정을 강화하는 것입니다.C++ unique_ptr 대 친구 클래스 개인 소멸자

내 질문은 무엇입니까? unique_ptr을 행복하게 만들고 여전히 ~LexedFile()을 개인용으로 유지하기위한 내 휴대용 옵션은 무엇입니까? 휴대용, 적어도 최신 g ++ 및 최신 Visual C++ 함께 작동합니다 같아요.

나는 같은 것을 삽입에 자상을했다 :

friend class std::unique_ptr<LexedFile>; 

를하지만이 (가하지 않았다) 근무했다하더라도 그것은 좀 휴대용되지 않을 수도 있습니다 구현에 대한 가정에 의존처럼 보였다.

+0

을 자신의 Deleter가 통과하는 대신 기본 일 : –

+0

는'친구가 클래스 표준 : : default_delete 가'도 가능하게 구현에 따라 일할 수를 사용하여,하지만 난에 포함되지 것입니다 그것과 아마도 당신이 그것을 노출하고자하는 것보다 더 많은 소멸자를 노출 아마 –

+0

또는 더 나은'친구 std :: unique_ptr :: deleter_type;'또한 사용자 정의를 사용하는'std :: unique_ptr ' deleter. –

답변

4

자신 만의 deleter로 std::unique_ptr을 인스턴스화하면됩니다. 나는이 일을 생각 :

class LexedFile 
{ 
    friend class Lex; 

//... 
private: 
    struct Deleter 
    { 
     void operator()(LexedFile *file) const 
     { 
      delete file; 
     } 
    }; 

    ~LexedFile(); 
}; 

class Lex 
{ 
//... 
private: 
    std::map<std::string, std::unique_ptr<LexedFile, LexedFile::Deleter>> Files; 
}; 
+0

당신의 모든 도움에 감사드립니다! (거의) 표준의 다운로드를 기다리고 난 후에, 나는 당신의 친구 선언과 함께 가기로 결정했다. 그것은 ("클래스"를 "구조체"로 변경 한 후에) 이식성이 있어야하는 것처럼 보였고, 사용 권한과 싸우기위한 래퍼를 만드는 대안은 우울했다. :-) 그것이 가지고있는 구멍이 무엇이든간에, 나는 확실히 그 클래스에 delete를 호출하는 누군가를 불법화합니다. 이것은 제가 일하고 싶었던 주요 알림입니다. 다시 한 번 감사드립니다! –

+0

괜찮아요, 문제 없어요. 행운을 빌어 요. –

+0

@RonBurk 저는 여러분이 정의되지 않은 행동에 의존하고 있다는 것을 거의 확신합니다. –