2009-07-15 8 views
0

m_MAX et ask() sont utilisés par run() mais ne devraient pas être publics. Comment/peut-on le faire?Comment/devrait être caché la variable et la fonction de membre statique C++?

#include <vector> 
class Q { 
public: 
    static int const m_MAX=17; 
    int ask(){return 4;} 
}; 
class UI { 
private: 
    std::vector<Q*> m_list; 
public: 
    void add(Q* a_q){m_list.push_back(a_q);} 
    int run(){return Q::m_MAX==m_list[0]->ask();} 
}; 
int main() 
{ 
    UI ui; 
    ui.add(new Q); 
    ui.add(new Q); 
    int status = ui.run(); 
} 

Répondre

5

Vous pouvez définir à la fois m_MAX et ask() dans la section privée de la classe Q. Puis, dans Q, ajoutez: "friend class UI". Cela permettra à l'interface utilisateur d'accéder aux membres privés de Q, mais personne d'autre. Notez également que l'interface utilisateur doit être définie avant l'instruction "friend class UI". Une déclaration avant fonctionnera.

+0

Modification de Q à: classe Q { privé: static int const m_MAX = 17; int ask() {return 4;} classe d'amis UI; }; Aucune erreur produite. Comment notez-vous la déclaration à terme? –

+0

Hmm peut-être que j'avais tort là-bas, j'ai supposé que vous auriez une erreur de symbole inconnu. Mais peut-être que la déclaration de l'ami agit comme une déclaration à terme. Bien que cela fonctionne bien. – DeusAduro

2

Une solution simple - faire m_MAX et demander() privé et faire l'interface utilisateur à un ami de Q.

0

Oui, déclarant UI comme ami de Q est la réponse à ce que vous demandez. Une autre solution pourrait consister à Q une classe imbriquée privée de l'interface utilisateur:

#include <vector> 

class UI { 
private: 
    class Q { 
    public: 
     static int const m_MAX=17; 
     int ask(){return 4;} 
    }; 

    std::vector<Q*> m_list; 

public: 
    void addNewQ(){m_list.push_back(new Q);} 
    int run(){return Q::m_MAX==m_list[0]->ask();} 
}; 

int main() 
{ 
    UI ui; 
    ui.addNewQ(); 
    ui.addNewQ(); 
    int status = ui.run(); 
} 

Maintenant, rien de Q est visible UI extérieur. (Qui peut ou peut ne pas être ce que vous voulez.)

0

La solution la plus simple serait de supprimer m_MAX de la classe et le mettre dans un anonymous namespace dans le .cpp dans lequel les deux Q::ask et UI::run sont définis. Comme il s'agit d'un static const, vous ne gagnez rien en le faisant dans le cadre de la déclaration de classe.

Questions connexes