1

私は C プログラマーですが、@school で C++ を長い間学んでいました。現在、C++ でコードを記述しようとしていますが、コンパイラ エラーが発生しています。コードの何が問題なのかを確認して教えてください。

typedef class _filter_session
{
private:
    static int session_count;  /* Number of sessions count -- Static */    
public:
    _filter_session();         /* Constructor */
    ~_filter_session();        /* Destructor */
}FILTER_SESSION;


_filter_session::_filter_session(void)
{
    (this->session_count)++;
    return;
}


_filter_session::~_filter_session(void)
{
    (this->session_count)--;
    return;
}

私が得ているエラーは

「エラー LNK2001: 未解決の外部シンボル "private: static int _filter_session::session_count" (?session_count@_filter_session@@0HA)」

ちなみに、Visual Studio 2005 を使用しています。

助けてください。

よろしく、

マイクロカーネル

4

4 に答える 4

8

static変数は、クラス本体の外側のどこかに定義する必要があります。クラス本体内の宣言は単なる宣言です。

たとえば、グローバル スコープで:

int _filter_session::session_count;

この定義がプログラム内で 1 回だけ発生するようにする必要があるため、通常、複数の翻訳単位に含まれるヘッダー ファイルではなく、ソース ファイル (.ccまたは) に配置します。.cpp

移植性のために、.で始まるクラス名を避ける必要があり_ます。typedefクラス名もほとんど必要ありません。class Name { //...は C++ で型名を導入するclass Nameため、型を参照するために使用する必要はありません。

于 2010-05-02T11:52:13.587 に答える
1

あなたの問題とは関係ありませんが、C++ では、次のようにクラスと構造体を型定義する必要はありません。

typedef class _filter_session
{
  ...
}FILTER_SESSION;

あなたは単に言うことができますし、そうすべきです:

class filter_session
{
  ...
};

また、クラス名はマクロと混同されるため、通常は大文字にすべきではありません。また、この構造を使用する必要はほとんどありthis->ません - あなたのコードは確かにそうではありません。

于 2010-05-02T11:56:24.593 に答える
1

static 変数を初期化する必要があります。このコードは実際にコンパイルされます:

typedef class _filter_session
{
private:
    static int session_count;  /* Number of sessions count -- Static */    
public:
    _filter_session();         /* Constructor */
    ~_filter_session();        /* Destructor */
}; // FILTER_SESSION;

int _filter_session::session_count = 0;


_filter_session::_filter_session(void)
{
    session_count++;
    return;
}


_filter_session::~_filter_session(void)
{
    session_count--;
    return;
}

int main(int argc, const char **argv)
{
  return 0;
}

注、FILTER_SESSION を g++/Linux でコンパイルするようにコメントし、main を追加して this-> を削除しました (別のメンバーが言及しているように、変数はオブジェクトのプロパティではなく、クラスのプロパティです。名前空間付きのグローバルと考えてください。変数)

于 2010-05-02T11:56:41.553 に答える
0

を使用するだけsession_count++です。this静的変数はクラスのどのインスタンスにも関連付けられていないため、 -pointerを介してアクセスすることはできません。クラスのすべてのインスタンスは、 の 1 つのインスタンスを共有しますsession_count。実際、session_countクラスのインスタンスが存在しなくてもアクセスできます。

編集OK、私の答えは問題を解決しませんが、チャールズ・ベイリーの答えは解決します。

于 2010-05-02T11:50:56.017 に答える