web-dev-qa-db-ja.com

プライベートと宣言された場合の静的メンバー変数

静的メンバー変数がクラスでプライベートとして宣言されている場合、どのように定義できますか?

次のクラス宣言があるとします

class static_demo
{
   private:
      static int a;

   public:
      static int b;

      void set(int x, int y)
      {
         a = x;
         b = y;
      }

      void show()
      {
         cout << "a = " << a << "\n";
         cout << "b = " << b << "\n";
      }
};

次に、aを定義する次のステートメントは、コンパイルエラーになります。

int static_demo::a;

では、クラスのプライベートセクションに静的データメンバーを含めることは可能ですか?

Gregに従って完全なコードを追加

#include <iostream>

using namespace std;

class static_demo
{
   private:
      static int a;

   public:
      static int b;

      void set(int x, int y)
      {
         a = x;
         b = y;
      }
};

int static_demo::a;
int static_demo::b;

int main()
{
   static_demo::b = 10;
   static_demo::a = 20;

   return 0;
}

コンパイルエラーは次のとおりです。

static_member_variable.cpp: In function `int main()':
static_member_variable.cpp:20: error: `int static_demo::a' is private
static_member_variable.cpp:26: error: within this context
15
nitin_cherian

静的メンバー変数がクラスでプライベートとして宣言されている場合、どのように定義できますか?

Source(cpp)ファイルでpublic static変数を定義するのと同じ方法で。

int static_demo :: a = 1;

アクセス指定子は、メンバーの定義中にエラーを出しません。アクセス指定子は、メンバー変数のアクセスを制御します。静的変数の定義は、許可される例外です。

Ideoneここでクリーンにコンパイルします。

EDIT:コードを投稿した後でQに回答します。
あなたの問題は、静的メンバーの定義ではありません。エラーは、main内のプライベート静的メンバーにアクセスしようとしているためです。それをしてはいけない。

クラスのプライベートメンバーには、クラスメンバー関数内でのみアクセスできます。同じルールが静的メンバーにも適用されます。静的メンバーを変更/アクセスできるようにするには、クラスにメンバー関数を追加してから、その内部の静的メンバーを変更/アクセスする必要があります。

23
Alok Save

あなたの.cppで:

int static_demo::a(0);

これによりエラーが発生した場合、最もよくあるのは、多重定義されたシンボル(たとえば、定義がヘッダーにあった)でリンカーエラーが発生したか、間違ったスコープで定義しようとした可能性があります。つまり、static_demo の中に namespace MON、それは.cppで定義されます:

#include "static_demo.hpp"
int MON::static_demo::a(0);

他のタイプの場合、それは単に誤ったコンストラクタであった可能性があります。

2
justin

問題は定義ではありませんが、main()で(static_demoの名前スコープになく、aがプライベートであることを確認できない)、assignmentを実行するという事実です。

aの定義は、int static_demo::a;を使用してグローバルスコープで行ったものです。 aを未定義の値で始めない場合は、初期化子が必要です。

int static_demo::a = 1;

問題を解決します。

以降、astatic_demo(そのフレンドの)の関数によってのみ操作できます。

0