web-dev-qa-db-ja.com

C ++クラスのオブジェクト数の静的変数?

静的メンバー変数に、作成されたオブジェクトの量を追跡させたいのですが。そのようです:

_class test{
    static int count = 0;
    public:
        test(){
            count++;

        }
}
_

VC++によると、_a member with an in-class initializer must be constant_であるため、これは機能しません。だから私は周りを見回しました、そしてどうやらあなたはすることになっています:

_test::count = 0;
_

それは素晴らしいことですが、私はカウントをプライベートにしたいです。

編集:おやおや、私はやらなければならないことに気づきました:

_int test::count = 0;
_

_test::count = 0_を実行するだけの何かを見たので、タイプを再度宣言する必要はないと思いました。

クラス内でこれを行う方法があるかどうか知りたいのですが。

edit2:

私が使用しているもの:

_class test{
    private:
        static int count;
    public:
        int getCount(){
            return count;
        }
        test(){
            count++;

        }
}
int test::count=0;
_

今それは言っています:'test' followed by 'int' is illegal (did you forget a ';'?)

edit3:

はい、クラス定義の後にセミコロンを忘れました。私はそれをしなければならないことに慣れていません。

12
mowwwalker

プット

static int count;

クラス定義のヘッダーで、および

int test::count = 0;

.cppファイル内。それはまだプライベートです(クラスのプライベートセクションのヘッダーに宣言を残した場合)。

これが必要な理由は、static int countが変数宣言であるためですが、名前test::countを使用するときにリンカが参照しているメモリ位置を認識できるように、単一のソースファイルで定義する必要があります。 。

13
Seth Carnegie

関数内の静的変数の初期化が許可されているため、ソリューションは次のようになります。

 class test
 {
    private:
    static int & getCount ()
    {
       static int theCount = 0;
       return theCount;
    }
    public:
    int totalCount ()
    {
       return getCount ();
    }

    test()
    {      
       getCount () ++;
    }
 };

一般に、この手法を使用すると、宣言での静的メンバーの初期化に関するC++の制限を回避できます。

3
elxala

staticクラスメンバーは名前空間スコープで定義(および潜在的に初期化)する必要があり、メンバーアクセスルールは適用されません。

1
Ben Voigt