2010-06-21 7 views
3

Dans ce code, la fonction foo de la portée globale tente d'accéder aux variables privées d'une Box, ce qui, bien sûr, ne fonctionne pas. Je dois faire en sorte que la fonction foo fonctionne avec une ligne de code au code du lieu d'une école.Accès à une variable privée dans une portée globale

#include <iostream> 

using namespace std; 
class Box { 
     int x,y; 

     public: 
      Box(int xi,int yi) {x=xi;y=yi;} 
      // One line of code to make foo(Box, Box) work 
}; 

bool foo(Box l,Box r) {return (l.x*l.y)>(r.x*r.y);} 

int main(int argc, char* argv[]) { 
    Box b1(3,4),b2(1,2); 

    if (foo(b1,b2)) cout << "b1>b2\n"; 

    return cin.get(); 
} 

Répondre

1

Declare foo comme friend function l'intérieur Box

#include<iostream> 

    class Box { 
    int x,y; 

    public: 
     Box(int xi,int yi) :x(xi),y(yi){}// Always use initializer list for initializing data members, i.e. prefer initialization over assignment 

     friend bool foo(Box,Box);// friend functions can access private members 
    }; 

    bool foo(Box l,Box r)  // friend keyword not to be written while defining the function 
    {return (l.x*l.y)>(r.x*r.y);} 

    int main(int argc, char* argv[]) { 
     Box b1(3,4),b2(1,2); 

     if (foo(b1,b2)) std::cout << "b1>b2\n"; 

    return std::cin.get(); 
    } 
+3

Pour les questions marquées devoirs je pense qu'il est préférable de donner les conseils nécessaires sans le code exact. De cette façon, ils peuvent regarder ce que vous leur dites et en tirer des leçons au lieu de copier/coller. –

+0

@Brian: Oui, je suis d'accord, mais je pense que ce n'est pas une raison valable pour votre downvote. –

+0

Vous faites une supposition, je n'ai pas downvote. Vérifiez mon numéro de compte de downvotes. Je downvote rarement. J'aime laisser des commentaires à la place. Probablement l'une des personnes qui a insisté sur mon commentaire. –

9

Regardez dans le mot-clé friend.

3

Tout d'abord, c'est pas a priori une chose sale. Le placement de la ligne de commentaire indique déjà que la classe Box contrôle qui est autorisé à toucher ses parties privées (jeu de mots). Deuxièmement, puisqu'il s'agit d'une tâche d'école, je pense que la solution aurait dû être mentionnée en classe: ceci peut être réalisé en utilisant une déclaration friend.

0

Outre les autres réponses impliquant des amis, une meilleure réponse à long terme (mais pas un changement d'une ligne) serait pour boîte surcharger la opérateurs de comparaison appropriés.

Questions connexes