2013-02-11 2 views
-1

여러 단계의 상속을받는 프로젝트가 있습니다. 이 모양은 다음과 같습니다.C++ 클래스 생성자가 public으로 정의되어 보호되어 있다고 말합니다.

XMLs -> Entity -> Item 그런 다음 Entity에서 상속 한 Item에서 상속 된 수많은 항목 클래스가 있습니다. 지금, 나는 정의 각 클래스

class Entity: public XMLs 
    { 
    public: 
      Entity() {} 
      virtual ~Entity() {}; 
     //other functions 
    }; 

을 표시이 나에게 문제를주고 하나입니다 있습니다. Item 객체 또는 모든 주요 유형의 객체를 만들려고 할 때마다 다음과 같은 오류가 발생합니다.

/usr/include/c++/4.6/ostream: In constructor ‘Entity::Entity()’: /usr/include/c++/4.6/ostream:363:7: error: ‘std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits]’ is protected

이게 무슨 의미입니까? 내가 생성자와 보호에 대해 다룰 때 Google은 공개 된 키워드를 보호합니다.

+5

실제 코드를 게시하는 것이 아닙니다. * 문제를 좁히고 * 대표적인, 최소한의 예제를 게시하는 데 약간의 노력을 기울이십시오. –

+4

대답은 공유하지 않는 오류 메시지입니다. 자신의 소스 파일에서 특정 행을 언급하는 오류 메시지. –

+1

@DrewDormann 동의 함 - 현지화가 너무 비슷 함 – djechlin

답변

5

메시지를 다시 읽으십시오. 생성자가 보호되어 있다고 말하면서 std::basic_ostream의 생성자가 보호되어 있다고 말합니다. 귀하의 학급 (또는 그 부모)은 std::basic_ostream (또는 아마도 std::ostream) 회원을 가지며, 기본 구성 될 수 없습니다. 인수로 구성해야합니다. This pagebasic_streambuf<Elem, Tr>*에서 cosntructed해야한다는 것을 보여줍니다.

이제는 실제로 추론 할 것입니다. 아마도 실제로 클래스에서 std::ostream 멤버가 필요하지 않거나 특정 파생 형식을 원하거나 참조를 원할 수도 있고 알 수없는 changable 파생 유형. 하지만 첫 번째 두 경우를 처리하여 클래스를 복사 할 수 없도록 만드는 것이므로 최종 솔루션은 사실상 항상 동일합니다. 클래스가 스트림을 소유하는 경우 std::unique_ptr<std::ostream>을 사용하고, 다른 누군가가 스트림을 소유하는 경우 std::ostream*을 사용합니다.

마지막으로 : 오류의 전체 텍스트는 Visual Studio의 "출력"창에 표시되며 "오류"창에는 요약 만 표시되는 것이 아닙니다. 오류의 전문은 클래스의 기본 생성자의 이름과 행 번호를 포함하여 오류에 대한 자세한 정보를 제공합니다.