0

如果我使用的是单例模式(是的,我知道 - 它们通常很糟糕)......并且我有一个像这样的实例函数:

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

什么是存储类instance

我正在阅读 David R. Butenhof 的“使用 POSIX 线程编程”,我遇到了这样的文字:

大多数时候,您可能会在文件范围内(即在任何函数之外)使用 extern 或静态存储类声明条件变量。如果它们被其他文件使用,它们应该具有普通(外部)存储类,如果它们仅在声明变量的文件中使用,它们应该具有静态存储类。

由于这个静态在函数内部,它是自动的吗?还是因为静态关键字而导致班级不同?

如果我将“实例”变量在其文件中移动为静态和全局(不在任何函数中) - 我仍然可以将它引用到另一个文件,还是不起作用?

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

一般来说,单例模式用于项目中,因此该项目中只会使用一个实例。像数据库连接池生成器或配置。单例的使用方式如下:类中总是被调用的实例必须是静态的和私有的,类的构造函数必须是私有的,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 回答