2011-09-05 3 views
16

나는 dll과 일부 응용 프로그램 코드간에 공유되는 기본 클래스를 만들어야하는 프로그램을 가지고있다. 그런 다음 주 응용 프로그램의 dll 파일에 하나씩 두 가지 파생 클래스가 있습니다. 이들 각각에는 nase 클래스의 데이터에서 작동하는 일부 정적 멤버 함수가 있습니다. (다른 곳에서 함수 포인터로 사용되는 것처럼 정적 일 필요가 있습니다.) 가장 간단한 형태로 아래에 나와 있습니다.파생 클래스의 정적 함수에서 보호 된 기본 클래스에 액세스 할 수 있습니까?

내 컴파일러는 Derived가 Base에 대한 액세스를 보호했지만 pBase의 보호 된 멤버에 액세스 할 수 없다는 불만을 표시합니다. 이 주변에 어떤 방법이 있습니까, 아니면 제가 오해하고 있습니까? Base 변수를 public으로 만들 수는 있지만 실제 인스턴스에서는 할당 된 메모리의 덩어리와 멀티 스레딩을 위해이를 보호하기위한 세마포어처럼 좋지 않습니다.

도움 말?

+1

가능한 [부모의 보호 된 변수에 액세스] (http://stackoverflow.com/questions/4829518/accessing-parents-protected-variables). 이것은 함수가 정적인지 아닌지에 대한 것이 아니라 기본 멤버가 액세스되는 매개 변수가 'Derived'유형이 아니기 때문입니다. –

+0

static 함수에 대한 인수는 함수 포인터의 호출 요구 사항을 준수하는 기본 클래스 여야합니다. 어쩌면 동적 캐스팅을 사용하여이 문제를 해결할 수 있습니다. –

+1

변환 할 수있는'static_cast'를 사용할 수있는'Derived' 객체의 기본 클래스 하위 객체 인'Base' 객체에 대한 포인터를 사용하여 함수가 호출되도록 제어 할 수 있다면 함수 본문에서'Base *'에서'Derived *'로 바뀝니다. 그렇지 않으면'Base'의'친구 '가되어야합니다. 그렇지 않으면'var'을 공개로 바꿀 수 있습니다. 이들 중 어느 것도 할 수 없다면 당신은 붙어 있습니다. –

답변

10

일반적으로 함수가 정적인지 여부에 관계없이 파생 클래스의 멤버 함수는 해당 형식의 개체 클래스 멤버 인 보호 된 멤버 만 액세스 할 수 있습니다. 정적 유형이 파생 클래스 (또는 파생 된 클래스)의 정적 유형이 아닌 경우 보호 된 멤버에 액세스 할 수 없습니다. 그래서 :

class Base { 
protected: 
    int var; 
} ; 

class Derived : public Base { 
    static void f1(Derived* pDerived) 
    { 
     pDerived->var = 2; // legal, access through Derived... 
    } 
    static bool Process(Base *pBase) 
    { 
     pBase->var = 2 ; // illegal, access not through Derived... 
    } 
} ; 
+0

그래서 내 정적 함수는 함수 포인터로 사용되고 인수는 파생 클래스에 동적으로 캐스팅 할 수 있어야하는 기본 클래스 여야합니다. –

+1

기본 클래스에 하나 이상의 가상 함수가 있으면 yes입니다. (또는'Derived * '함수를 변경하여 클라이언트에게'dynamic_cast '를 남길 수 있습니다.) –

0

액세스 지정자는 Derived 클래스 핸들 (참조/포인터/개체)가 아니라 Derived 클래스 자체의 방법에 적용됩니다. 메서드가 static이 아니더라도 동일한 오류가 발생했을 수 있습니다. 파생 핸들로 var에 액세스하지 않기 때문입니다. Demo.

class Base { 
protected: 
    int var ; 
public: 
    void setVar(const int v) { var = v; } // <--- add this method 
}; 

참고 :

올바른 방법은 setter 방법을 제공하는 것입니다 밖으로 또 하나 개의 방법이 있습니다,하지만 난 그게 우아한 있는지 모르겠습니다.

(static_cast<Derived*>(pBase))->var = 2; 
+0

불행히도 내 실제 클래스에서 기본 클래스의 데이터는 실제로 메모리 블록과 세마포어로드입니다 다중 스레드 액세스 용. 세마포어와 메모리의 덩어리에 getter와 setter를 사용하는 것은베이스에 아마도 10-15 개의 변수가 있기 때문에 매우 성가신 것처럼 보입니다. –