2017-10-06 4 views
0

fichier d'en-tête (.h):Comment les objets d'instance voient-ils les membres privés de la fonction d'un paramètre d'objet?

bool canTravelWith(const Passenger&) const; 

Fichier de mise en œuvre (Cpp):

bool Passenger::canTravelWith(const Passenger& x) const 
    { 
     bool canTravel = false; 

     //if both passengers have the same destination on the same date... 
     if (strcmp(x.m_destination,this->m_destination) == 0 && x.m_year == this->m_year && x.m_month == this->m_month && x.m_day == this->m_day) 
     { 
      canTravel = true; 
     } 

     return canTravel; 
    } 

Hé les gars,

Le code ci-dessus fonctionne, mais ce que je voulais savoir est si le les membres de l'objet du paramètre sont accessibles en privé; Comment puis-je appeler les membres de cet objet dans mon canTravelWith()?

Dans tous les autres cas; Je ne serais pas capable d'appeler les membres privés d'un objet.

Je veux comprendre pourquoi.

Merci. (:..

+1

Je suis confus, vous accédez aux membres privés de votre classe? Quel est le problème avec ça? –

+1

Donc, vous demandez pourquoi pouvez-vous accéder à des membres privés de la classe 'Passenger' de la classe 'Passenger'? Quelle? Pensez à lire un [bon livre] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

Répondre

1

La définition de private et protected ne vous empêche d'avoir accès à ces sortes de propriétés ou des fonctions de dans la même classe

Cette fonction est Passenger il a accès à tout ce qui Il y a deux instances d'un objet en jeu qui ne vous limitent pas: private ne signifie pas que les autres instances ne peuvent pas le toucher, seulement les autres classes

0

Cela est dû au fait qu'un membre privé est un membre privé d'une classe, et non une instance.

C'est la même chose que de demander pourquoi vous pouvez accéder au membre privé de this, puisque this est un pointeur passé en paramètre à votre fonction, mais simplement caché.

Pour mettre cela en perspective, considérez ce code:

bool Passenger::canTravelWith(const Passenger& x) const 
{ 
    Passenger const* ptr = this; 

    // ptr is this, of course I can access private stuff! 
    (void) ptr->m_destination; 

    if (rand() % 10) { 
     ptr = &x; 
    } 

    // Is the compiler will really try to guess if ptr 
    // still points to this? privateness is a compile time 
    // property of the class, not runtime. 
    (void) ptr->m_destination; 
} 

En outre, l'accès parlementaire ne nécessitent pas une instance du tout:

struct Passenger { 
private: 
    static constexpr int value() { return 42; } 

public: 
    static constexpr int v = value(); 
}; 

Comme vous pouvez le voir, nous créons une variable statique dont la valeur provient d'une fonction statique privée. Mais puisque nous sommes dans la portée de la classe, nous pouvons y accéder. Voici un autre exemple:

struct Outer { 
private: 
    int value = 42; 

public: 
    struct Inner { 
     int getPrivate(Outer& o) { return o.value; } 
    }; 
}; 

int main() { 
    Outer o; 
    Outer::Inner i; 

    int v = i.getPrivate(o); 
} 

Comme vous pouvez le voir, Inner accéder aux membres privés de Outer, whithout être un ami. C'est simplement parce que Inner est dans la portée de la classe.