2013-09-22 10 views
6

Sono bloccato con un problema C++. Ho una classe base che ha un puntatore all'oggetto autoreferenziale all'interno dell'area di visibilità privata della classe. Ho un costruttore nella classe base che inizializza questi due puntatori. Ora ho la mia classe derivata il cui specificatore di accesso è privato (voglio rendere private le funzioni membro pubblico della mia classe base). Ora attraverso le funzioni membro della mia classe derivata voglio creare un puntatore a oggetti che possa puntare ai dati privati ​​della classe base, cioè a quei puntatori di oggetti autoreferenziali. Il mio codice è:Come rendere una classe derivata accedere ai dati dei membri privati?

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

Utilizzare 'protected' anziché' private'? –

+4

Crea un getter 'protetto' per il membro' private'? Di solito il tuo design è difettoso se hai bisogno di tali soluzioni, però. –

+0

Anche questo non funziona. Errore del compilatore. Ho provato anche quello. Solo rendendolo pubblico posso accedervi. Ma questo renderebbe il codice vulnerabile. –

risposta

11

La classe derivata non può accedere ai membri privati ​​della sua classe base. Nessun tipo di ereditarietà consente l'accesso ai membri privati.

Tuttavia, se si utilizza la dichiarazione friend, è possibile farlo.

+0

Lo so, ma non c'è modo di farlo. L'unica altra opzione è usare le classi di amici. Ma voglio risolvere il problema usando l'ereditarietà. –

+3

Puoi usare friend dichiarartion !!! o meglio usare protetto invece che privato :) –

4

Non c'è altro modo per accedere ai dati privati ​​di altre classi e quindi all'amicizia. Quello che puoi fare con l'ereditarietà, tuttavia, è accedere ai dati protetti della classe base. Ma ciò non significa che puoi accedere ai dati protetti di un altro oggetto del tipo base. È possibile accedere solo i dati della parte di base della classe derivata protetta:

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

Grazie per l'aiuto –

2

cercano di dare protette come l'identificatore di accesso in classe di base ed ereditare la classe base in privato ..... ma per ulteriore utilizzo delle funzioni membro della classe base u potrebbe essere necessario disporre di poche funzioni inline poiché saranno convertite anche in privato

Problemi correlati