2010-09-29 7 views
0

Je suis en train d'emballer une structure C dans une classe C++ pour tirer parti de la gestion de la mémoire et autres. J'ai rendu fou la structure un membre privé et a fourni une fonction publique pour fournir l'accès. Le type de retour est constant, puisque toutes les fonctions qui prennent l'objet comme argument ont const dans leur signature.Problème d'exactitude avec le constructeur de copie?

#include <gsl/gsl_rng.h> 

class GSLRand { 
    gsl_rng* r_; // see links below 

public: 
    GSLRand() { 
     gsl_rng_env_setup(); 
     r_ = gsl_rng_alloc(gsl_rng_default); 
    } 

    ~GSLRand() { 
     gsl_rng_free(r_); 
    } 

    const gsl_rng* rng() { 
     return r_; 
    } 
}; 

Tout compile bien. Le problème se produit lorsque je deviens intelligent et essaie d'ajouter un constructeur de copie. Son introduction dans la classe comme ...

public: 
.... 
    GSLRand(const GSLRand& R) { 
     r_ = gsl_rng_alloc(gsl_rng_taus); 
     gsl_rng_memcpy(r_, R.rng()); 
} 
.... 

Je reçois l'erreur du compilateur suivant:

 
GSLRand.h: In copy constructor ‘GSLRand::GSLRand(const GSLRand&)’: 
GSLRand.h:35: error: passing ‘const GSLRand’ as ‘this’ argument of ‘gsl_rng* GSLRand::rng()’ discards qualifiers 

J'utilise g ++ sur un Mac. J'ai essayé les différentes variantes et ne peux toujours pas comprendre comment je suis confus le compilateur (ou moi-même!). Fait intéressant, j'obtiens l'erreur identique lorsque je supprime le spécificateur const de rng().

Des idées?

Pour la documentation des fonctions utilisées: random number generation, les sections sur les "variables d'environnement" et les "générateurs de copie".

Répondre

5

Marque rng() Fonction const: const gsl_rng* rng() const {.

+0

wilx a raison. const gsl_rng * rng() {} indique seulement que le pointeur renvoyé est const mais vous devez indiquer que la fonction ne modifie pas non plus l'objet. C'est le second const avant le {} – fschmitt

+0

Il y a plus que ça. –

+0

vous êtes super! –

3

Modifier cette fonction:

const gsl_rng* rng() const { 
    return r_; 
} 
2

Deux problèmes. D'abord, vous appelez une fonction membre non const via une référence d'objet const. Je ne peux pas faire ça. Vous pouvez faire GSLRand::rnd() une fonction membre const:

const gsl_rng* rng() const {

... mais vous avez un deuxième problème: gsl_rng() retourne un const gsl_rng*, mais vous essayez d'assigner à une variable non membre const. Je ne peux pas faire ça non plus.

Fourche sur la route. Soit vous appelez toujours const les fonctions membres via le pointeur r_, soit vous appelez parfois des fonctions non-const à travers lui.

Si vous avez toujours appeler const fonctions membres, puis faire le membre le point variable à un const gsl_rng:

const class gsl_rng* r_; // see links below 

Sinon, faites votre déclaration de fonction rng() un pointeur non const, tout en conservant la méthode elle-même const:

gsl_rng* rng() const { 
     return r_; 
    } 
+0

Merci pour la réponse détaillée. Je me suis toujours demandé ce que ces const signifient entre la déclaration et la définition. Ceci est vraiment utile. –

+0

@Jerry: De rien.Juste à titre d'explication, lorsque vous déclarez une fonction membre const, vous dites au compilateur d'interpréter le pointeur this comme 'const', donc vous ne pourrez pas appeler un membre non-'const' fonctionne ou modifie les variables membres non -mutable'. –

Questions connexes