2015-11-22 3 views
0

J'ai 2 classes (firstClass et secondClass) dont firstClass est un ami de secondClass, et a unordord_map imbriqué privé, auquel je veux accéder dans une fonction de secondClass. Donc, fondamentalement, le code est comme ceci:C++ Accès à un membre privé dans une classe d'amis

class secondClass; 
    typedef unordered_map STable<unsigned, unordered_map<unsigned, double> > NESTED_MAP; 


     class firstClass{ 
     friend class secondClass; 
     void myfunc1(secondClass* sc){ 
      sc->myfunc2(&STable); 
     } 
     private: 
      NESTED_MAP STable; 
     }; 


     class secondClass{ 
     public: 
      void myfunc2(NESTED_MAP* st){ 
      //Here I want to insert some elements in STable. 
      //Something like: 
      st[1][2]=0.5; 
      } 
     }; 
    int main(){ 
      firstClass fco; 
      secondClass sco; 
      fco.myfunc1(&sco); 
      return 0; 

     } 

Je sais qu'il devrait être trivial, mais je ne sais pas comment le résoudre. Une idée? (J'ai changé le code et la question pour le rendre plus clair)

+2

Comment voulez-vous accéder à un membre de données publiques si une classe dans une autre classe ? – juanchopanza

+0

Je n'ai pas compris votre point. – Hakim

+0

Pensez-y. – juanchopanza

Répondre

1

Une classe d'ami est autorisée à accéder à n'importe quel membre privé, ainsi vous pouvez simplement appeler des méthodes et modifier des propriétés comme vous le feriez si elles avaient été publiques.

Here la documentation, il est dit:

La déclaration d'ami apparaît dans un corps de classe et accorde une fonction ou d'une autre classe l'accès aux membres privés et protégés de la classe où la déclaration d'ami apparaît.

Cela dit, en regardant votre exemple, je préfère changer l'endroit où mettre le mot-clé ami, car il me semble que ma_fonction2 ne doit pas être public.

Il suit un exemple où j'ai appliqué la suggestion ci-dessus et qui montre comment faire face à privés membres d'une classe ami:

#include<unordered_map> 

using namespace std; 

class firstClass; 

class secondClass{ 
    friend class firstClass; 

private: 
    void myfunc2(unordered_map<unsigned,double>& map){ 
     map[1]=0.5; 
    } 
}; 

class firstClass{ 
public: 
void myfunc1(secondClass* sc){ 
    // here firstClass is accessing a private member 
    // of secondClass, for it's allowed to do that 
    // being a friend 
    sc->myfunc2(STable); 
} 
private: 
    unordered_map<unsigned,double> STable; 
}; 

int main(){ 
    firstClass fco; 
    secondClass sco; 
    fco.myfunc1(&sco); 
    return 0; 
} 
+0

Merci beaucoup skypjack. Comme j'étais trop fatigué, j'ai totalement ignoré ça. Ça marche. – Hakim