0

私は2つのクラスを持っていFooますBar.

フー。

class Foo
{
public:
    static void Setm(int i) { m = i; }
private:
    static int m;
};

Bar.h

class Foo;
class Bar
{
 public:
     Bar(int m) {Foo::Setm(m);}
};

main.cpp

#include "Foo.h"
#include "Bar.h"
void main() {
   Bar bar(5);
}

コンパイルすると、次のエラーが表示されます。シンボル "private: static int Foo::m" (?m@Fool@@0HA)

4

4 に答える 4

2

非整数/列挙型の静的クラス メンバー変数は、その宣言/定義の外で初期化する必要があります。

そのような場所の 1 つは、main からのグローバル スコープです。

つまり、main.cpp で:

 int Foo::m = 0;
于 2013-03-13T16:40:38.463 に答える
0

いくつかのこと。

  • ヘッダー ガードを含める必要があります。

例:

//Foo.H
#ifndef __FOO_H__
#define __FOO_H__
...
...
#endif
  • Bar.H は、Foo の実装に関する知識を必要とするコンストラクターを実装する場合、Foo.H を含める必要があります。(あなたは)
    • これは、後で遭遇する可能性が高い別の問題です。
  • 静的メンバーは、グローバルスコープで初期化する必要はなく、一度だけ定義する必要があります。

他の回答の状態にもかかわらず、メインはこれを行うには恐ろしい場所です。これを行うには、このクラスを使用するすべての人がメインでこれを行うことを知っている必要があります。あなたのヘッダー (またはあなたのチームの別の開発者やコードの別のブロック) を使用したいときに、メインで静的定数を定義する方法をどうやって知ることができますか? 答えは、私はしません。それは悪い習慣を形成する怠惰な習慣です。そして、静的な初期化/破壊の楽しみを始めさせないでください。

Foo.H に入れることはできません。これを行うと、ヘッダーを含むすべてのコンパイル ユニットによる再定義によるリンカー エラーが発生するためです。

これを行うのにはるかに適した場所は、新しく作成された Foo.[c|.cxx|.cpp|.cc] (使用する接尾辞は何でも) です。メインは動く?はい、うまくいきます...今あなたのために。後で問題が発生しますか?おそらく。それは覚えておくべき良い形と解決策ですか?絶対違う。

ベストアンサー

//Foo.C (NOT MAIN)  
#include<Foo.h>  
int Foo::m = 0;  

また、私の答えは、コンストラクターでそれを使用する2番目のクラスとは何の関係もないことに注意してください。ポイントがあれば、コンストラクターやクラスメンバー関数とは関係がないため、質問のタイトルを編集します。メンバ関数/メソッドではなく、静的クラス メソッド/関数について話している。

于 2013-03-13T17:44:02.087 に答える
0

静的変数を初期化する必要があります:

class Foo
{
public:
    static int m;
static void Setm(int i) { m = i; }
private:
};
int Foo::m=2;

class Foo;
class Bar
{
 public:
 Bar(int m) {Foo::Setm(m);}
};


int main(int argc, char** argv) {
    Foo::Setm(5);
    Bar b(5);
    return 0;
}
于 2013-03-13T16:56:21.367 に答える
0

置く

int FOO::m = 0;

実装ファイル内のクラス定義の外。

于 2013-03-13T16:40:33.403 に答える