【发布时间】:2021-08-27 07:27:33
【问题描述】:
我正在尝试将构建器模式应用于对象,但私有构造函数在内部类中不可见。
#include <iostream>
#include <memory>
class Outer{
private:
Outer(void){ std::cout << "Constructed!" << std::endl; }
public:
class Builder{
public:
std::unique_ptr<Outer> build(void){
return std::make_unique<Outer>();
}
};
};
int main(int argc, char** agrs){
std::unique_ptr<Outer> instance = Outer::Builder().build();
return 0;
}
失败并出现以下错误:
In file included from /usr/include/c++/8/memory:80,
from scrap.cpp:2:
/usr/include/c++/8/bits/unique_ptr.h: In instantiation of ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = Outer; _Args = {}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<Outer>]’:
scrap.cpp:11:35: required from here
/usr/include/c++/8/bits/unique_ptr.h:831:30: error: ‘Outer::Outer()’ is private within this context
{ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
scrap.cpp:6:2: note: declared private here
Outer(void){ std::cout << "Constructed!" << std::endl; }
^~~~~
我在定义中尝试了friend class Outer::Builder,但Outer 在friend 子句中不完整,所以我无法使用它。我非常想将对象的实例化限制为 Builder 类,有没有办法在 C++ 中做到这一点?
还是将 Outer 构造函数设为 public 是唯一的选择?
【问题讨论】:
-
问题是
std::make_unuque需要访问你的私有构造函数,它不能,因为它既不是朋友也不是成员。 -
stackoverflow.com/a/5013735/1467600 另有说法,但你对 c++14 是正确的..(在 c++14 中与 pre c++11 有相同的错误)
-
在 C++03 中,您需要使内部类成为朋友以引用私有 ctor,但您的内部类无论如何都不会恢复到 ctor。
std::make_unique会。 -
@DavidTóth 你错过了
n. 1.8e9-where's-my-share m.写给你的重点。从内部类访问外部类没有问题,反之亦然,模板std::make_unique不能访问非公共构造函数是问题。 -
哦,我错过了!对...
标签: c++ c++14 inner-classes builder