【问题标题】:Accessing private static variable outside class访问类外的私有静态变量
【发布时间】:2016-11-16 13:26:51
【问题描述】:

一段时间后我在做 C++,我在类中声明了一个静态变量为私有的,据我所知,静态变量独立于对象并在对象之间共享。如果我尝试在外面打印静态变量使用类名的类我得到编译错误是因为变量是私有的吗?我确实读到静态变量只能通过类名和范围解析运算符访问。

#include <iostream>

using namespace std;

class Sample{

    int val;
   static int value;
    public:


        Sample(int in);
        Sample();
        void setval(int in){

            val = in;
        }

        void printval ()const{

            cout << val<<endl;
        }

};

Sample::Sample(int in){

    val = in;
}

Sample::Sample(){

    val = 0;
}

int Sample::value = 34;
int main()
{

   const Sample obj(1);
   Sample obj2;

   obj2.printval();

   obj.printval();

  cout <<"static value = " << Sample::value;

   return 0;
}

错误

main.cpp:37:5: error: 'int Sample::value' is private                                                                                                                                                  
 int Sample::value = 34;                                                                                                                                                                              
     ^                                                                                                                                                                                                
main.cpp:49:39: error: within this context                                                                                                                                                            
   cout <<"static value = " << Sample::value; 

【问题讨论】:

  • is this because the variable is private 是的,错误消息正是告诉您这一点。变量是静态的这一事实并不会改变它仍然是私有的这一事实。
  • 如果你不希望变量是private,为什么要声明它为private
  • 这就是私有的意思——不允许在课堂外使用它。见:stackoverflow.com/questions/860339/…
  • 你也在访问非静态函数中的静态变量。它也会给你错误。

标签: c++


【解决方案1】:

据我所知,静态变量独立于对象并在对象之间共享

没错。但是,跨对象实例共享变量和使变量可访问是相互独立的。 (共享的、可访问的)对有四种组合。您可以使用所有四个:

  • public static 变量在类外共享和访问
  • private static 变量是共享的,但不能在类外访问
  • public 非静态变量不共享,但可以在类外访问
  • private 非静态变量在类外既不共享也不可访问

请注意,您处理私有静态 value 的方式可以仿照您处理非静态 val 的方式,即通过为您的类用户提供一些公共成员函数来处理静态变量:

class Sample {
...
public:
    static int getvalue() { return value; }
};

现在你可以像这样打印它:

cout << "static value = " << Sample::getvalue();

【讨论】:

  • 使用现有的 printval() 方法打印出静态变量。
  • @SanthoshPai 这也有效。非静态成员函数可以访问静态成员变量以及非静态成员变量。
【解决方案2】:

私有类成员和方法只能由类的成员和方法访问。无论类成员是否是静态的,这都是正确的。这对类成员的可访问性没有影响。

请注意,公共类方法可以访问私有类成员,就像任何其他方法一样,这并不妨碍公共类方法返回指针或对私有类成员的引用。这是您的一种选择。

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2020-01-27
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多