构造函数中的C ++单例

时间:2016-10-31 04:49:18

标签: c++ design-patterns memory-leaks singleton

这可能吗?

class A {
    static A *instance = NULL;

public:
    A () {
        if (instance) {
            this = instance;
        } else {
            instance = this;
        }
    }
}

是否有泄密记忆?

我是否需要过载new运算符?

3 个答案:

答案 0 :(得分:2)

没有。忽略编译器错误,您的课程将无法正常工作。

@Galik has provided invaluable sources了解你如何构建一个单身人士。但是让我们看看你的。

class A {
    static A *instance = NULL; // NULL isn't even a thing, but assuming you mean nullptr you can't assign a static like this

public:
    A () {
        if (instance) {
            this = instance; // this can't be assigned
        } else {
            instance = this; // this is correct
        }
    }
};

哪个可以提供以下内容:

class A {
    static A *instance;

public:
    A () {
        // if there's no instance, this is the one we'll use
        if (!instance) {
            instance = this;
        }
    }
};

A* A::instance = nullptr;

无论如何,这并不能阻止你构建多个。

答案 1 :(得分:1)

您无法为此

指定值

答案 2 :(得分:1)

不可能。如果公开并调用构造函数,则不可避免地会创建A的新对象。最优雅和广泛使用的C ++单例类实现使用静态方法返回单个静态实例,同时隐藏(例如make private可访问的)构造函数。

以下是一个例子:

class A {
private:
    static A *instance_; // use nullptr since C++11
    A() {}
public:
    static A& instance() {
        if (!instance_)
            instance_ = new A();
        return *instance_;
    }
};

A* A::instance_ = nullptr;