2

今日、シングルトンについて質問しましたが、発生したいくつかのエラーを理解するのに苦労しています。次のコードがあります。

タイミング.h

class Timing {

public:
    static Timing *GetInstance();
private:
    Timing();
    static Timing *_singleInstance;
};

タイミング.cpp

 #include "Timing.h"

 static Timing *Timing::GetInstance() {  //the first error
    if (!_singleInstance) {
        _singleInstance = new Timing();  //the second error
    }
    return _singleInstance;
}

このコードには、理解できないエラーが 2 つあります。

  1. メソッドGetInstance()はヘッダーで static として宣言されています。cpp ファイルで単語を省略しなければならないのはなぜstaticですか? エラーが発生します:「メンバー関数 'static Timing* Timing::GetInstance()' を静的リンケージを持つように宣言できません」。正しい書き方は次のとおりです。

    Timing *Timing::GetInstance() { ... }  
    
  2. なぜ私は書くことができないの_singleInstance = new Timing();ですか?「Timing::_singleInstance への未定義の参照」というエラーが表示されます。_singleInstancecpp ファイルでグローバル変数として定義することで、このエラーを解決しました。

4

5 に答える 5

5

1: static は、クラス宣言外の関数宣言/定義に使用される場合、「ローカル リンケージ」を意味します。

ローカル リンケージは、特定の関数がこの特定のファイル内のコードからのみ参照できることを意味し、クラス内のメソッドではあまり意味がありません。

2: クラス宣言は複数回含めることができるため、静的メンバーの実際のストレージは cpp ファイルで定義する必要があります。

#include "Timing.h"

Timing* Timing::_singleInstance;

Timing *Timing::GetInstance() {  //the first error
    if (!_singleInstance) {
        _singleInstance = new Timing();  //the second error
    }
    return _singleInstance;
}
于 2010-09-08T21:39:53.157 に答える
2

質問 2 を参照: cpp ファイルの先頭に静的変数を指定する必要があります。

Timing* Timing::_singleInstance = NULL;
于 2010-09-08T21:38:59.183 に答える
1
  1. staticクラス内とは、クラス外とはまったく異なるものを意味staticします。ええ、C++ の最大の設計上の決定ではありませんが、それを受け入れなければなりません。

  2. 私は泣き言がリンカから来ていると想像しています。それは、その変数を宣言したが定義していないため、未定義の参照になっているためです。.cpp次のような行をファイルに追加するだけです。

    Timing* Timing::_singleInstance;
    
于 2010-09-08T21:40:12.030 に答える
0
  1. はい、.cpp ファイルの static を省略する必要があります

  2. _singleInstanceたとえば、.cpp ファイルに次のように記述して、どこかに「メモリを予約」する必要があります。

    タイミング *Timing::_singleInstance = NULL;

(メンバー関数の定義外)

于 2010-09-08T21:38:26.510 に答える
-1

定義では、static キーワードを省略する必要があります。それはC++の構文だからです。大したことはありません。

エラー番号 1 を修正すると、エラー番号 2 が自動的に修正されます。

于 2010-09-08T21:39:43.157 に答える