2013-09-22 2 views
6

저는 C++ 문제로 고생했습니다. 클래스의 private 가시 영역 안에 자체 참조 객체 포인터가있는 기본 클래스가 있습니다. 이 두 포인터를 초기화하는 기본 클래스의 생성자가 있습니다. 이제 액세스 지정자가 private 인 파생 클래스가 생겼습니다 (저는 기본 클래스의 public 멤버 함수를 private으로 만들고 싶습니다). 이제 파생 된 클래스의 멤버 함수를 통해 기본 클래스의 개인 데이터, 즉 자체 참조 객체 포인터를 가리킬 수있는 객체 포인터를 만들고 싶습니다. 내 코드 :파생 클래스가 개인 멤버 데이터에 액세스하는 방법?

class base{ 
private: 
    base *ptr1; 
    int data; 
public: 
    base(){} 
    base(int d) { data=d } 
}; 

class derived:private base{ 
public: 
    void member() 
}; 

void derived::member() 
{ 
base *temp=new base(val); //val is some integer 
temp->ptr1=NULL; //I can't make this happen. To do this I had to declare all the 
       //private members of the base class public. 
} 
+8

'private'대신 'protected'를 사용 하시겠습니까? –

+4

'private' 멤버에 대해'protected' getter를 만드시겠습니까? 보통 이러한 솔루션이 필요한 경우 설계에 결함이 있습니다. –

+0

그 중 하나가 작동하지 않습니다. 컴파일러 오류. 그것도 시험해 보았다. 공개적으로 만 액세스 할 수 있습니다. 하지만 코드가 취약해질 수 있습니다. –

답변

11

파생 클래스는 기본 클래스의 비공개 멤버에 액세스 할 수 없습니다. 전용 멤버에 대한 액세스를 허용하는 상속 유형이 없습니다.

그러나 friend 선언을 사용하면 그렇게 할 수 있습니다.

+0

나는 그것을 알고 있지만 그것을 할 방법이 없다. 유일한 다른 옵션은 친구 클래스를 사용하는 것입니다. 하지만 상속을 사용하여 문제를 해결하고 싶습니다. –

+3

친구 declarartion을 사용할 수 있습니다 !!! 또는 개인 대신에 더 나은 보호를 사용하십시오 :) –

4

다른 클래스의 개인 데이터에 액세스 한 후 우정을 나타내는 다른 방법은 없습니다. 그러나 상속을 사용하여 수행 할 수있는 작업은 기본 클래스의 보호 된 데이터에 액세스하는 것입니다. 하지만 기본 유형의 다른 객체의 보호 된 데이터에 액세스 할 수있는 것은 아닙니다. 당신은 액세스 파생 클래스의 베이스 부분의 데이터를 보호 할 수 있습니다 : 기본 클래스의 액세스 지정자로 보호와 개인 모드에서 기본 클래스를 상속 줄

class base{ 
protected: //protected instead of private 
    base *ptr1; 
    int data; 
public: 
    base(){} 
    base(int d) { data=d; } 
}; 

class derived:private base{ 
public: 
    void member(); 
}; 

void derived::member() 
{ 
    base *temp=new base(3); 
    //temp->ptr1 = 0; //you need friendship to access ptr1 in temp 

    this->ptr1 = 0; // but you can access base::ptr1 while it is protected 
} 

int main(){} 
+0

도움을 주셔서 감사합니다 –

2

시도 .....하지만위한 기본 클래스 u의 멤버 함수를 더 사용하면 짧은 인라인 함수가 필요하지 않을 수 있습니다. 또한 private으로 변환됩니다.

관련 문제