2012-05-03 10 views
3

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

+2

グローバル変数(静的専用クラスでラップされている)を使用して呼び出されます。 – birryree

答えて

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(); 
} 
2

私はこれを「時代遅れ」と呼んでいます。本質的には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は静的な寿命を持っていることを意味しているので、構造体は名前にのみ影響し、初期化や破壊などは影響しません。

+0

変数 'extern'を宣言する必要はありませんか? –

+0

@LuchianGrigore:他のグローバルと同様に、externを一箇所も持たずに定義し、他のTUから使いたい場合は、それらを 'extern'宣言します(通常は宣言必要に応じてそれを含む)。 –

+0

それは私が言ったことです。 –

関連する問題