如何防止以A类中的任何其他方式创建B类的对象

dar*_*enn 1 c++ constructor

这是我得到的:

class A{
    B* object;
    const B& create_object(){
        if(object == nullptr)
            object = new B(this);
        return *object;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这就是事情.我不应该允许以任何其他方式创建B而不是A.我允许创建B对象的唯一方法是:

A a;
auto b1 = a.create_object();
Run Code Online (Sandbox Code Playgroud)

现在因为我不应该允许创建对象,所以我将所有B的构造函数设为私有,并且说A是B.HOWEVER的朋友.

auto b1 = a.create_object();
Run Code Online (Sandbox Code Playgroud)

它不会在调用复制构造函数时编译.有什么办法可以避免吗?我不想返回指针,它需要是一个对象.

For*_*veR 6

b1将被推断为B,而不是const B&,因此编译器将检查,copy-ctor是否可用,const auto&用于此案例

A a;
const auto& b1 = a.create_object();
Run Code Online (Sandbox Code Playgroud)