0

シングルトンパターンを使用している場合(ええ、私は知っています-それらは通常悪いです)...そして私は次のようなインスタンス関数を持っていました:

MySingleton* Instance() {
    static MySingleton instance;
    return &instance;
}

ストレージクラスとはinstance何ですか?

「DavidR。ButenhofによるPOSIXスレッドを使用したプログラミング」を読んでいて、次のようなテキストに出くわしました。

ほとんどの場合、ファイルスコープで、つまり関数の外部で、externまたは静的ストレージクラスを使用して条件変数を宣言します。他のファイルで使用される場合は通常の(外部)ストレージクラスが必要であり、変数を宣言するファイル内でのみ使用される場合は静的ストレージクラスが必要です。

この静的関数は関数内にあるので、自動ですか?または、静的キーワードのためにクラスが異なりますか?

'instance'変数をそのファイル内で静的でグローバル(どの関数でもない)に移動した場合でも、別のファイルへの参照を与えることができますか、それとも機能しませんか?

4

3 に答える 3

4

instance静的ストレージクラスがあります。これは、static修飾子なしで修飾されているためautomatic、ローカルスコープで変数になります。
ファイルスコープで宣言された静的変数には内部リンケージがあり、異なるファイル間でそれらを使用することはできません。
ファイル間で使用できるグローバル変数を宣言する場合externは、変数の外部リンケージを提供するを使用する必要があります。

于 2012-01-10T14:26:43.437 に答える
4

使用するキーワードのアドバイスは正しいですが、著者は保存期間とリンクを混同していると思います。

関数スコープ変数instanceには静的ストレージ期間があります。staticキーワードがないと、自動保存期間があります。

ファイルスコープのオブジェクトには、常に静的ストレージ期間があります(まあ、またはキーワードを使用したC ++ 11のスレッドストレージ期間thread_local)。staticファイルスコープでキーワードを使用すると、オブジェクトに内部リンケージextern与えられ、外部リンケージが与えられます。これらはストレージ期間に影響しません。

staticいわゆる「ストレージクラス指定子」であるため、「静的ストレージクラス」を持つものを記述することは正しいですがstatic、ファイルスコープ内の意味は関数スコープ内の意味とは異なるため、全体像ではありません。

静的ストレージ期間を持つオブジェクトへの参照を他の変換ユニットからのコードに渡すことができます。ファイルスコープと関数スコープのどちらを持っているかは関係ありません。また、そのリンケージが何であるかは関係ありません。「他のファイルで使用される場合は、通常の(外部)ストレージクラスが必要です」とは、他のファイルが名前で参照する場合、グローバルに外部リンケージが必要であることを意味します。これは、内部リンケージを持つグローバル名が別のオブジェクトを参照するためです。各TUで。技術的には、オブジェクトではなく、リンクを持つ名前です。

于 2012-01-10T14:27:53.780 に答える
1

一般に、シングルトンパターンはプロジェクトで使用されるため、そのプロジェクトで使用されるインスタンスは1つだけです。DB接続プールジェネレーターや構成など。シングルトンは次のように使用されます。常に呼び出されるインスタンスは、クラス内で静的かつプライベートである必要があり、クラスのコンストラクターはプライベートである必要があり、getInstance関数はパブリックである必要があります。以下を見てみましょう:

/**
 * @author harzumanian
 *
 */
public class LogManager {

    private File file = null;
    private static LogManager logger = null;

    /**
     * 
     */
    private LogManager() {
        file = new File(Constants.PLUGIN_LOG);
    }

    public static LogManager getLogger() {
        if (logger == null) {
            logger = new LogManager();
        }
        return logger;
    }
}
于 2012-01-10T14:33:42.720 に答える