在另一个文件中使用protected static variable

时间:2011-10-08 00:27:34

标签: c++ static

如何在类定义中访问已声明为static且 protected 的变量,以便在另一个文件中使用b.cpp

3 个答案:

答案 0 :(得分:2)

允许使用protected类成员(静态或非静态)的唯一代码是有问题的类的明确朋友和派生自相关类的类(当然还有类本身的成员)。因此,如果“您”想要访问该值,那么“您”必须是该类的朋友或从其派生的类的成员。

存在保护类(publicprotectedprivate)以提供数据保护。通过声明成员为protected,该类的作者正在做一个半强的声明,说明应该允许哪些代码触及那段内存。如果您不是派生类或已获得明确friend规范的许可,则不允许您触摸它。

您不应仅仅为了获得protected静态成员的访问而从类中派生。如果基于派生类尝试执行此操作而有意义,则应该从类派生。

答案 1 :(得分:0)

声明为protected后,静态变量只能在其成员函数及其派生类(public,protected inheritance)中访问。

答案 2 :(得分:0)

我在一个无法修改的课程中遇到过这个问题(标准适配器),并在SO& S的帮助下提出了以下解决方案。谷歌!

#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。寻找“流标准适配器”。