2014-03-30 4 views
-1

제 질문은 실제로이 모든 것을 말하고 있지만 단지 문제를 반복 할 것입니다.C++ 클래스 C에서 클래스 A의 보호 된 변수에 액세스합니다. 여기서 C는 A의 하위 클래스 인 B의 하위 클래스입니다.

클래스 A에는 액세스하려는 보호 된 변수 (벡터)가 있습니다.

클래스 B는 클래스 A의 하위 클래스이며 생성자에서이 벡터에 액세스하여 원하는대로 추가 할 수 있습니다.

그러나 클래스 C (클래스 A의 하위 클래스)에서이 벡터에 생성자를 추가하고 싶지만 컴파일러에서 알려줍니다.

클래스 A :

class ClassA 
{ 
protected: 
    std::vector<Object *> myVector; 
}; 

클래스 B :

class ClassB : ClassA, AnotherClass 
{ 
public: 
    ClassB() 
    { 
     this->myVector.push_back(new Object); 
    } 
} 

클래스 C는 : 여기

내 코드 어떤 경우

class ClassC : public ClassB 
{ 
public : 
    ClassC() 
    { 
     this->myVector.pushBack(new Object); 
    } 
} 

사람이 말해 줄 수 있습니까 제약 때문에 제약이 불가능하다. C++ 또는 내 코드 때문에?

언제나 감사드립니다.

답변

1

ClassB은 개인적으로 ClassA을 상속합니다. 즉, 상속 된 모든 멤버는 private에서 ClassB이므로 ClassC에 액세스 할 수 없습니다.

해결책은 사용자의 요구 사항에 따라 다르며 질문에 명시되지 않았습니다. 그것은 공공 상속을 사용하는 것만 큼 간단 할 수있다 :

class ClassB : public ClassA, AnotherClass 

또 다른 대안이 ClassB에게 ClassC에서 벡터를 수정할 수있는 공용 또는 보호 된 멤버 함수를 제공하는 것입니다. 에

+0

'ClassB'에서이 벡터에 어떻게 추가 할 수 있을지 제안 할 수 있습니까? –

+0

@AdamCarter 정말로 당신이하려는 일에 달려 있습니다. 공개적으로 상속합니까? 'ClassC'가 벡터를 수정할 수있게 해주는'ClassB'에 멤버 함수를 추가 하시겠습니까? – juanchopanza

+0

"C++의 제약이나 코드 때문에 내가 할 수있는 일이 불가능하면 누구나 말해 줄 수 있니?" "어쨌든 고마워. :) –

1

변경 ClassB :

class ClassB : public ClassA, AnotherClass 
{ 
public: 
    ClassB() 
    { 
     this->myVector.push_back(new Object); 
    } 
} 
0

문제는 ClassB가 단지 "수입"를 ClassA의 개인 회원이다.

class ClassB : protected ClassA, AnotherClass 
+0

고맙습니다. 그리고 zumalifeguard에게! 내 같은 어리석은 실수! –

0

이 문제는 당신이 무엇을 선언하지 않았다된다

당신이 앞에 추가 중 "보호"또는 ClassB가 당신의 정의를 ClassA의 "공개"뿅과 같이 하나를 수행 할 작동하도록 코드를 얻으려면 상속 classA의 타입은 클래스 B의 서브 클래스입니다. 다음 코드는 나를 위해 잘 컴파일됩니다. (공용 클래스 A로 상속 변경)

class classA{ 
    protected: 
    int a; 
}; 

class classB : public classA{ 
    public: 
    classB() 
    { 

    this->a = 0; 
    } 

}; 

class classC : public classB 
{ 
    public: 
    classC() 
    { 
    this->a = 1; 

    } 
};