2016-11-16 17 views
1

私は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; 
+2

'これです。変数が静的であるという事実は、それがまだ私的であるという事実を変えない。 – SingerOfTheFall

+1

変数を 'private'にしたくないのであれば、なぜそれを' private'と宣言したのですか? –

+2

これはプライベートとは何ですか?許可しないとクラス外で使用できません。 参照:http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance – woockashek

答えて

2

限り、私は正しいことを

静的変数は、オブジェクトの独立していることを知っているとオブジェクト間で共有します。しかし、オブジェクトインスタンス間で変数を共有し、変数にアクセス可能にすることは、互いに独立しています。 (共有、アクセス可能な)ペアの4つの組み合わせがあります。すべての4つはあなたに利用できます。

  • public static変数が共有して
  • private static変数が共有されているクラスの外部アクセスが、
  • public非静的変数が共有されていないクラスの外部アクセスが、アクセスされていませんクラス外
  • private非静的変数が共有されていないどちらも、クラスの外側からアクセス
class Sample { 
... 
public: 
    static int getvalue() { return value; } 
}; 
:あなたはプライベート静的 valueに対処する方法は、非静的 valで作業方法をモデルにした静的変数で動作するようにあなたのクラスのユーザーにいくつかのパブリックメンバー関数を与えることによって、すなわち、できること注意

は今、あなたはこのようにそれを印刷することができます:変数がyes private`され、エラーメッセージがまさにそれをあなたに言っているので、

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

既存のprintval()メソッドを使用して静的変数を出力しました。 –

+0

@SanthoshPaiそれも動作します。非静的メンバー関数は、非静的メンバー変数とともに静的メンバー変数にアクセスできます。 – dasblinkenlight

1

プライベートクラスのメンバーとメソッドは、クラスのメンバーとメソッドでアクセスできます。これは、クラスメンバーが静的であるかどうかにかかわらず当てはまります。これは、クラスメンバのアクセシビリティに影響を与えません。

パブリッククラスメソッドは他のメソッドと同様にプライベートクラスメンバにアクセスできますが、パブリッククラスメソッドがプライベートクラスメンバへのポインタまたは参照を返すことを排除するものではありません。それはあなたのための一つの選択肢です。

関連する問題