使用私有构造函数在静态方法中创建对象

时间:2015-09-16 17:37:24

标签: c++

#include<iostream>
using namespace std;

struct A {
    static A& create(int i)
    {
        A a(i);
        return a; // Ignore this problem.
    }

    void print() { cout<< _a <<endl; }
private:
    A(int i):_a(i){}
    int _a;
};
int main()
{
    A& a = A::create(2);
    a.print();
    return 0;
}

我不明白一些事情:

  • 由于静态方法与特定实例无关,我不这样做 了解如何创建一个具有私有的A对象 构造
  • 静态方法只能用于静态变量和方法。在旁边 事实上它是私有的,为什么构造函数(它是一个 隐式静态?)可以被称为?

1 个答案:

答案 0 :(得分:2)

  

由于静态方法与特定实例无关,我不明白如何创建具有私有构造函数的A对象。

静态方法,在A类定义中,可以访问私有构造函数。如果你的样品:

static A& create(int i)
{
    A a(i);
    return a; // Ignore this problem.
}

你正在返回对UB的局部变量的引用(这是你上面评论的原因吗?)。也许您的意思是static A create(int i)std::unique_ptr

static std::unique_ptr<A> create(int i) {
    return std::unique_ptr<A>(new A(num));
} 

或单例(但名称create()表示其相当工厂方法):

static A& create(int i)
{
    static A a(i);
    return a; // Ignore this problem.
}
  

静态方法只能用于静态变量和方法。除了它是私有的,为什么构造函数(它是一个隐式的静态?)可以被调用吗?

如上所述,您的静态方法可以访问您的类的私有方法。调用构造函数是因为您正在堆栈上创建局部变量,它是合法的。