3 votes

rendre une variable inaccessible dans une certaine portée, possible ?

Existe-t-il un moyen de désactiver tout accès à une variable dans une certaine portée ?

Son utilisation pourrait être similaire à ceci :-

int outerOnly=5; //primitive or class or struct, it can also be a field
outerOnly=4;  //ok
{//vvv The disable command may be in a block?
    disable outerOnly; //<--- I want some thing like this.
    outerOnly=4; //should compile error (may be assert fail?)
    int c=outerOnly;  //should compile error
}
outerOnly=4;  //ok

Si la réponse est non, existe-t-il une fonction plus proche de celle-ci ?

Il serait utile dans quelques situations de débogage.
Edit : Par exemple, je sais avec certitude qu'une certaine portée (également trop unique pour être une fonction) ne devrait jamais accéder à une certaine variable unique.

6voto

AlexD Points 7089

Envisagez de mettre en œuvre quelque chose comme cela (peut-être avec des constructeurs de copie et des opérateurs d'affectation supprimés) :

struct disable
{
private:
    disable(const disable&) = delete;
    disable& operator=(const disable&) = delete;
public:
    disable() {}
};

Ensuite, en plaçant

disable outerOnly;

à l'intérieur de la portée interne donnerait à peu près les erreurs souhaitées.

Gardez à l'esprit que, comme @Cornstalks commenté, qu'il peut conduire à des avertissements du compilateur liés à l'ombrage (qui, à leur tour, peuvent généralement être désactivés au cas par cas).

2voto

user2079303 Points 4916

Existe-t-il un moyen de désactiver tout accès à une variable dans une certaine portée ?

Non, cette fonction n'existe pas.

Si la réponse est non, existe-t-il une fonction plus proche de celle-ci ?

Au lieu d'un simple bloc, vous pourriez définir et appeler une fermeture qui ne capture pas la variable indésirable :

int outerOnly;
int innerToo;
[&innerToo]()
{
    innerToo  = 42;        // ok
    outerOnly = 4;         // fails to compile
    int c     = outerOnly; // fails to compile
}();

1voto

Il suffit de faire un struct Outeronly; .

Notez que les messages d'erreur peuvent laisser perplexe si l'on n'est pas familier avec eux.

1voto

thorhunter Points 363

Voici une solution assez simple :

int main()
{
        int outerOnly=5; //primitive or class or struct, it can also be a field
        outerOnly=4;  //ok
        #define outerOnly outerOnly_disabled
        //outerOnly=4; //error outerOnly_disabled is not declared
        //int c=outerOnly;  //error 
        #undef outerOnly

        outerOnly=4;  //ok
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X