Использование защищенной статической переменной в другом файле - PullRequest
0 голосов
/ 08 октября 2011

Как получить доступ к переменной, которая была объявлена ​​как статическая и защищена в определении класса для использования в другом файле b.cpp

Ответы [ 3 ]

2 голосов
/ 08 октября 2011

Единственный код, которому разрешено использовать protected члены класса (статические или нет), являются явными друзьями рассматриваемого класса и классов, производных от рассматриваемого класса (и, конечно, членами самого класса). Следовательно, если «вы» хотите получить доступ к этому значению, то «вы» должны быть либо другом этого класса, либо членом класса, производного от него.

Классы защиты (public, protected и private) существуют для обеспечения защиты данных. Объявляя член protected, автор этого класса делает полужесткое заявление о том, какой код должен быть разрешен для этой части памяти. Если вы не производный класс или получили разрешение с явной спецификацией friend, то вам не разрешено его трогать.

Вы не должны наследоваться от класса исключительно для получения доступа к protected статическому члену. Вы должны наследовать от класса, только если это имеет смысл делать, основываясь на том, что пытается сделать ваш производный класс.

0 голосов
/ 08 октября 2011

Я сталкивался с этим однажды в классе, который я не могу изменить (стандартные адаптеры), и предложил следующее решение с помощью SO & Google!

#include <iostream>

class my_type{
protected:
    static int var;
};

int my_type::var = 0;

int& get_var(my_type& obj){
    class protected_accessor : my_type{
    public:
        static int& get_var(my_type&){
            return my_type::var;
        }
    };
    return protected_accessor::get_var(obj);
}

int main(){
    my_type obj;
    std::cout << get_var(obj) << std::endl;
    get_var(obj) = 1;
    std::cout << get_var(obj);
}

Я использовал вариантэтого кода в моей крошечной утилите: https://bitbucket.org/AraK/streamer/wiki/Developer_FAQ. Найдите «Стандартные потоковые адаптеры».

0 голосов
/ 08 октября 2011

Объявив защищенным, статическая переменная может быть доступна только в ее функциях-членах и в ее производных классах (публичное, защищенное наследование).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...