静的メンバー変数がクラスでプライベートとして宣言されている場合、どのように定義できますか?
次のクラス宣言があるとします
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
静的メンバー変数がクラスでプライベートとして宣言されている場合、どのように定義できますか?
Source(cpp)ファイルでpublic static変数を定義するのと同じ方法で。
int static_demo :: a = 1;
アクセス指定子は、メンバーの定義中にエラーを出しません。アクセス指定子は、メンバー変数のアクセスを制御します。静的変数の定義は、許可される例外です。
Ideoneここでクリーンにコンパイルします。
EDIT:コードを投稿した後でQに回答します。
あなたの問題は、静的メンバーの定義ではありません。エラーは、main
内のプライベート静的メンバーにアクセスしようとしているためです。それをしてはいけない。
クラスのプライベートメンバーには、クラスメンバー関数内でのみアクセスできます。同じルールが静的メンバーにも適用されます。静的メンバーを変更/アクセスできるようにするには、クラスにメンバー関数を追加してから、その内部の静的メンバーを変更/アクセスする必要があります。
あなたの.cppで:
int static_demo::a(0);
これによりエラーが発生した場合、最もよくあるのは、多重定義されたシンボル(たとえば、定義がヘッダーにあった)でリンカーエラーが発生したか、間違ったスコープで定義しようとした可能性があります。つまり、static_demo
の中に namespace MON
、それは.cppで定義されます:
#include "static_demo.hpp"
int MON::static_demo::a(0);
他のタイプの場合、それは単に誤ったコンストラクタであった可能性があります。
問題は定義ではありませんが、main()で(static_demoの名前スコープになく、a
がプライベートであることを確認できない)、assignmentを実行するという事実です。
a
の定義は、int static_demo::a;
を使用してグローバルスコープで行ったものです。 a
を未定義の値で始めない場合は、初期化子が必要です。
int static_demo::a = 1;
問題を解決します。
以降、a
はstatic_demo
(そのフレンドの)の関数によってのみ操作できます。