3

Tabs というクラスを持つ作業コードベースがあります。このクラスのすべてのメソッドと変数は静的として定義されています。クラスの静的メンバーは、そのクラスのオブジェクトのすべてのインスタンスによって共有されることを理解しています。このクラスは、ある種のデータをセットとして格納するために使用されます。多くの異なるファイルは、クラス Tabs のオブジェクトをインスタンス化することなく、メンバー関数 Tabs::find() および Tabs::Insert() を使用します。これがどのように機能し、このプログラミング手法が何と呼ばれているかを理解しようとしています。ありがとう。

4

2 に答える 2

4

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();
}
于 2012-05-03T18:10:53.107 に答える
2

私がこれを呼ぶのは「時代遅れ」です。をエミュレートするために、本質的にclass(またはstruct、場合によっては)を使用していnamespaceます。

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 whatever {
    int a, b, c;
    double x, y, z;
}

namespaceおそらく、言語に追加される前のコードを扱っているだけでしょう。namespaceそれほど古いものではない場合、作成者である可能性があります。または、 (適切に)サポートしていないコンパイラへの移植性を維持する意図があった可能性があります。

いずれにせよ、あなたが持っているのは修飾名を持つグローバル変数です。それらはclass/structの中にありますがstatic、静的な寿命があることを意味するため、構造体であることは名前のみに影響し、初期化や破棄などには影響しません。

于 2012-05-03T18:23:36.243 に答える