2011-10-26 2 views
1

에 의해 소유 클래스 내에서 ++ 기본 생성자 C 보호. 오류는 Some class : error C2248: cannot access protected member declared in class ''입니다. 이 오류를 재현하는 코드는 다음과 같습니다. 보호 된 기본 생성자가있는 다른 개체를 소유하는 개체를 만드는 방법을 알아낼 수 없습니다. 입력 매개 변수를 사용하는 다른 생성자가 있지만 논리적 추론에 관계없이 호출 할 수는 없습니다. 분명히, 나는 바보 같거나 정말로 중요한 것을 놓치고있어, 그래서 누군가 내 실수를 잡을 수 있는지 알아보기 위해 여기에두고있다. 모두에게 감사합니다!오류 C2248 : 나는 마이크로 소프트 비주얼 스튜디오 10 컴파일러에서 얻을이 오류를 해결하기 위해 노력하고있어 다른 클래스

#ifndef FOO_H 
#define FOO_H 

class Foo { 
    public : 
     int myFooInt; 

     ~Foo(); 

     Foo(int fooInt); 

    protected : //Uncomment to generate C2248 Error 
     Foo(); 
}; 

#endif 

.

#include "foo.h" 

Foo::Foo() { 

} 
Foo::Foo(int fooInt) : myFooInt(fooInt) { 

} 

Foo::~Foo() { 
} 

.

#ifndef GOO_H 
#define GOO_H 

#include "foo.h" 

class Goo { 
    public : 

     ~Goo(); 

     Goo(); 

     Goo(Foo foo); 

     Foo myFoo; 

}; 

#endif 

.

#include "Goo.h" 

Goo::Goo() { 

} 

Goo::Goo(Foo foo) : myFoo (foo) { 
} 

Goo::~Goo() { 
} 

.

#include "foo.h" 
#include "goo.h" 

void main() { 
    Foo foo(5); 
    Goo goo(foo); 
} 

답변

3

입력 매개 변수를 사용하지만 적용 할 논리 추론에 관계없이 호출 할 수없는 다른 생성자가 있습니다.

아, 이제 우리는 중요한 부분 (다른 답변을 protected 키워드를 이해하기위한 당신의 신용을 제공하지 않는 것 죄송에 도착,하지만 당신은 조금 혼란 보이는 당신이 제시하는 방식을 당신의 문제). 당신은 그 생성자가 수행하지만 당신은는 기본 생성자가 . 얼마나 많은 작업 생성자를 쓰는지는 중요하지 않습니다. 작동하지 않는 컴파일러는 여전히 컴파일 타임 오류를 발생시킵니다. 컨테이너 클래스

기본 생성자 초기화 목록이 없습니다, 따라서 데이터 멤버의 기본 생성자를 사용하려고 시도합니다. 멤버의 기본 생성자에 액세스 할 수 없으므로 컨테이너의 기본 생성자를 컴파일하지 못합니다.

가능한 해결 방법 : 명시 적으로 컨테이너의 기본 생성자의 초기화 목록에서 다른 생성자를 사용하여 멤버를 초기화합니다. 이것은 당신이 어떻게 든 가치를 만들어야한다는 것을 의미합니다. (즉 항상 가능한 것은 아닙니다. 그렇게되면, 그것은 기본 생성자를 갖는 컨테이너 클래스에 대한 이해가되지 않습니다 당신을 말하는 컴파일러의 방법입니다. :))

+0

당신에게 정말 고마워요 !!!! 이전에 int 입력 매개 변수를 사용하여 컨테이너 클래스의 생성자에 초기화 목록을 만들었지 만 내 기본 생성자에서도 생성자를 갖고 있다고 생각하지 않았습니다. 내 게시물을 철저히 읽으면서 정말 고마워. – nndhawan

0
protected

부재가 아닌 이러한 부재를 포함하는 객체에 의해 유도 된 동일한 클래스 인스턴스에 액세스 할 만하다. 당신이 할 수없는 싶지, Goo이 기본의 작성을 허가되어 있지 않은 경우는 protected가 될 기본 생성자의 요청에 따라 Foo의 인스턴스를 구축 하였다.

A) 같은 클래스

B)하지 않는 protected 멤버와 클래스에서 파생 된 클래스가 없습니다 :

0

당신은 클래스에 의해 보호 된 멤버에 액세스 할 수 없습니다.