Tabsというクラスを持つ作業用コードベースがあります。このクラスのすべてのメソッドと変数は静的として定義されています。クラスの静的メンバーは、そのクラスのオブジェクトのすべてのインスタンスによって共有されることを理解します。このクラスは、あるタイプのデータをセットとして格納するために使用されます。多くの異なるファイルでは、クラスTabのオブジェクトをインスタンス化せずに、メンバー関数Tabs :: find()とTabs :: Insert()を使用します。私はこれがどのように機能し、どのようなプログラミング手法が呼び出されるのかを理解しようとしています。ありがとう。クラスのメンバーにアクセスします。このクラスのオブジェクトはインスタンス化されませんでした。すべてのメンバーは静的型です
答えて
static
データメンバーはmain
が入力される前に初期化されます。そのためアクセスするのがその理由です。ダイナミックまたは自動ではなく、スタティックメモリ内に存在します。
静的メンバーだけのクラスは、グローバル変数と関数を持つのと似ていますが、グループ化されています。これはプログラミング技術ではありません。単なるグローバルです。
//globals.h
class Globals
{
static int x;
public:
static int getX() {return x;}
};
//globals.cpp
#include "Globals.h"
int Globals::x = 1;
//main.cpp
#include "Globals.h"
//x is initialized before call to main
int main()
{
int x = Globals::getX();
}
私はこれを「時代遅れ」と呼んでいます。本質的にはclass
(または場合によってはstruct
)を使用して、namespace
をエミュレートしています。あなたはおそらくnamespace
が言語に追加された以前からコードを扱っている
namespace whatever {
int a, b, c;
double x, y, z;
}
:
class whatever {
static int a, b, c;
static double x, y, z;
};
int whatever::a, whatever::b, whatever::c;
double whatever::x, whatever::y, whatever::z;
はかなりのと同じです。それほど古くない場合は、著者があるかもしれません。あるいは、おそらくnamespace
(正しく)をサポートしていないコンパイラへの移植性を維持する意図がありました。
いずれにしても、修飾された名前を持つグローバル変数です。彼らがclass
/struct
の中にいるにもかかわらず、static
は静的な寿命を持っていることを意味しているので、構造体は名前にのみ影響し、初期化や破壊などは影響しません。
変数 'extern'を宣言する必要はありませんか? –
@LuchianGrigore:他のグローバルと同様に、externを一箇所も持たずに定義し、他のTUから使いたい場合は、それらを 'extern'宣言します(通常は宣言必要に応じてそれを含む)。 –
それは私が言ったことです。 –
- 1. クラスに静的なconstexprメンバーのインスタンスはありませんか?
- 2. クラスは別のクラスの静的メンバーとして定義されています
- 3. クラスと派生クラスのインスタンスは、非静的メソッドを介して間接的にクラスの静的メンバーを変更することができます。#
- 4. C++:クラスまたはインスタンスを介してconstメンバーにアクセスできますか?
- 5. 派生型でクラスの静的メンバーを使用していますか?
- 6. クラスの静的メンバーを使用してオブジェクトを作成する
- 7. 静的メンバー関数は暗黙的にインライン化されたクラス内で定義されていますか?
- 8. PHP - クラスのコンストラクタ内でのオブジェクトのインスタンスの初期化、静的メンバー内でのアクセス
- 9. 静的内部クラスは、外部クラスのすべての静的データメンバーと静的メンバー関数にどのようにアクセスできますか?
- 10. クラスと同じデータ型のクラスで、どのようにして静的メンバーを宣言できますか?
- 11. クラスはなぜ静的メンバーを持つことが許されますが、非静的メンバーは持てませんか?
- 12. QtのQIconのインスタンスを自分のクラスの静的メンバーとして持つことは可能ですか?
- 13. 継承クラスでオーバーライドされた静的メンバーにアクセスする方法は?ここで
- 14. 非静的メンバー関数は静的メンバー関数またはデータにアクセスできますか?
- 15. インスタンス上の静的メンバーにアクセスする方法は?
- 16. メンバー初期化子は非静的なデータメンバーまたは基本クラスの名前を付けません
- 17. 派生クラス内のクラスの保護されたメンバーにアクセス
- 18. 関数のクラスの静的メンバーを定義する方法は?ここで
- 19. このクラスのオブジェクトはどのようにしてメンバー関数にアクセスできますか?
- 20. C++でクラスの仮想静的メンバーをシミュレートしていますか?
- 21. ネストされたクラス:静的コンテキストで非静的フィールドにアクセスできません
- 22. f#型メンバーの静的に解決された型
- 23. クラスをJavaで静的としてインスタンス化できますか?
- 24. クラス内で2つのクラスを定義し、そのメンバーにアクセス
- 25. 静的メンバーへのアクセスをサブクラス化するためのルールは何ですか?私は、静的メンバーと浮気して
- 26. ハッシュセットとすべてのメンバーが同じクラスの異なるインスタンス
- 27. 静的メンバーを含むC++テンプレートクラス - クラスのすべてのタイプに同じ
- 28. はインスタンス化されたオブジェクトにアクセスできません。C#/ asp.net
- 29. 完全修飾静的メンバー定義はコンパイルされません
- 30. クラス内の列挙を編集する(メンバーはインスタンス参照でアクセスできません)
グローバル変数(静的専用クラスでラップされている)を使用して呼び出されます。 – birryree