2011-07-28 2 views
3

Je suis en train de faire quelque chose comme ce qui suit:Référence à la variable membre dans la déclaration de fonction en C++?

class FOO { 
void bar(int& var = m_var) { 
    // .... 
} 
int m_var; 
}; 

Pourquoi ne pas compiler? Pourquoi n'ont-ils pas programmé cela dans la langue? Est-il possible d'imiter ce comportement?

+0

double possible de [membre Nonstatic comme argument par défaut d'une fonction membre non statique] (http://stackoverflow.com/questions/4539406/nonstatic-member-as- a-default-argument-of-a-nonstatic-member-function) – Nawaz

Répondre

6

Ceci n'est pas autorisé car m_var est une variable membre qui doit être accessible via l'objet.
compile successfully si m_var était un membre statique de la classe.

Une solution simple appelle une fonction surchargée avec le même nom ou d'une autre fonction membre par bar() (qui est une fonction membre & a accès à m_var) et passer m_var comme paramètre par reference.It aura le même effet que vous voulez atteindre. Je suis d'accord, il s'agit d'une limitation de la langue.

+0

@AIs - c'est peu déroutant, car vous pouvez accéder à m_var depuis l'intérieur de la fonction. par exemple. barre de void (int & var) {cout << m_var; } Cela semble autorisé car la barre est une fonction membre non statique et ne peut être appelée qu'à l'aide d'un objet de FOO. Le même raisonnement s'applique à la définition ci-dessus aussi, non? pourquoi le compilateur se plaint-il d'avoir accédé directement à un membre non statique? – cppcoder

+0

@srikrish: Lorsque vous accédez à une variable membre, dites 'membervar' dans une fonction membre non statique, elle exécute' this-> membervar'. Ceci est passé en tant que paramètre implicite à chaque fonction membre. –

+0

@AIs - alors pourquoi le compilateur ne peut-il pas faire de même pour accéder à m_bar dans les arguments de fonction ... Une nouvelle barre est appelée en utilisant un objet de FOO, ce pointeur est donc disponible. Comme l'a souligné Alexandre, cela ressemble à une limitation du compilateur. Bien, je pense quel serait le but d'un tel usage? – cppcoder

4

Il peut être implémenté dans les compilateurs (à mon humble avis) sans difficulté.

Si vous voulez que ce comportement, vous devez écrire:

class FOO 
{ 
    void bar(int& var) { ... } 
    void bar() { this->bar(m_var); } 

    int m_var; 
}; 

et l'appel de fonction supplémentaire sera inline par un compilateur demi-décent, dans le cas où vous vous inquiétez à ce sujet.

0

Une solution consiste à avoir statiques-variables, qui agissent comme des espaces réservés:

class FOO 
    { 
    private: 
     static int _ph_m_var; 
     void bar(int& var = _ph_var) 
     { 
       if(&var == &_ph_var) { // Default } 
     } 
}; 
0

Declare m_var être un const statique. Il compilera et fonctionnera.

const statique int m_var devrait faire l'affaire

Questions connexes