1. ホーム
  2. c++

[解決済み] error: nononst static data member must be initialize out of line

2022-02-08 14:06:13

質問

class Solution {
    public:

     static int m=INT_MIN; // it shows error: non-const static data member must 
                               be initialized out of line.(why?)
                                  using "int m=INT_MIN" is fine. 
      int func(TreeNode*root){
        if(root==NULL){
            return 0;
        }

        int l=max(func(root->left),0);
        int r=max(func(root->right),0);

        m=max(l+r+root->val,m);

        return max(l,r)+root->val;

    }


    int maxPathSum(TreeNode* root) {

        if(root==NULL)
        {
         return 0;
        }
        m=INT_MIN;
        int x=func(root);
        return m;

    }
};

変数の値を更新する必要がある m . したがって、私は static int というデータ型があります。しかし、次のようなエラーが発生します。 使用している int の代わりに static int は正常に動作しています。しかし、なぜ static int がエラーになるのですか?

解決方法は?

Bjarne Stroustrupが解説しています。 こちら :

クラスは通常、ヘッダーファイルで宣言され、そのヘッダーファイルは は多くの翻訳ユニットに含まれるのが一般的です。しかし リンカのルールが複雑になるため、C++では、すべてのオブジェクトが一意であることが要求されます。 を定義しています。C++でクラス内定義が可能な場合、このルールは破られることになります。 オブジェクトとしてメモリに格納する必要があるエンティティを定義することができます。

Stroustrupが言ったように、すべてのクラスには固有の定義が必要です。さて、静的メンバはそのクラスと直接結びついていることはご存知の通りです。では、2つのケースを考えてみましょう。

  1. その static メンバはまた constant なぜなら、コンパイラは独自の最適化を行い、このメンバの値が決して変化しないことが保証されているので、このメンバをコンパイル時の定数として扱うことができるからです。つまり、このメンバの値は固定されているので、このメンバが関連するクラスの定義も固定されているのです。だから、初期化はインラインで許されるのです。

  2. static メンバは一定ではありません。そして、その値はプログラムの実行中に後で変更される可能性があります。そのため、コンパイラはこのメンバに対してコンパイル時の最適化を行うことができない。したがって、クラスがロードされたときにこのようなメンバを初期化しようとするときに生じるかもしれない複雑さを防ぐために、このようなメンバのインライン初期化は許可されていません。

PS: 私も初めてこのコンセプトを聞いたときは、プログラマーが望む機能である直交性の原則に沿わないため、戸惑いました。直交性の原則とは、「直交性の原則に従えば、(1)(2)(3)(4)を組み合わせることができる。 intstaticintconst と書くことができるはずです。 static const intstatic int と同じような形で。しかし、ここでのこのケースは、言語の開発者がコンパイルプロセスの単純化と引き換えに、言語のユーザーのために直交性をあきらめなければならない状況の一例と言えるでしょう。

直交性の概念を見てみよう こちら