友元函数无法构造类的唯一指针
Friend function is unable to construct a unique pointer of the class
我有一定的设计策略,其中我的类的构造函数是私有的,只能由类的朋友构造。 在 friend 函数中,我尝试使用 std::make_unique
创建我的类的unique_pointer,但它无法编译。我的 VC12 编译器抱怨
C:\Program Files (x86)\Microsoft Visual Studio 12.0\vc\include\memory(1639):错误 C2248:"垃圾邮件::垃圾邮件":无法访问在类"垃圾邮件"中声明的私有成员
编译过程中失败的相关代码如下
#include <memory>
class Spam {
public:
friend void Foo();
private:
Spam(int mem) :mem(mem) {}
int mem;
};
void Foo() {
std::unique_ptr<Spam> spam = std::make_unique<Spam>(10);
}
为什么我无法编译?
这是我看到的另一种方法,显然称为密钥习惯用法:让公共构造函数需要私有访问令牌。
class Spam {
struct Token {};
friend void Foo();
public:
Spam(Token, int mem) : mem(mem) {}
private:
int mem;
};
void Foo() {
std::unique_ptr<Spam> spam = std::make_unique<Spam>(Spam::Token{}, 10);
}
void Bar() {
// error: 'Spam::Token Spam::token' is private
// std::unique_ptr<Spam> spam = std::make_unique<Spam>(Spam::Token{}, 10);
}
在您的情况下,函数make_unique
正在尝试创建Spam
的实例,而该函数不是友元。从友元函数内部调用非友元函数不会使非友元函数充满友元状态。
要解决这个问题,你可以用Foo
写:
std::unique_ptr<Spam> spam(new Spam(10));
Why am I not able to compile?
您无法编译,因为make_unique
不是Spam
的朋友。
让make_unique
成为朋友的另一种解决方案是将unique_ptr的创建移至 Spam
.
class Spam {
...
private:
Spam(int) {}
static unique_ptr<Spam> create( int i )
{ return std::unique_ptr<Spam>( new Spam(i) ); }
};
然后Foo
叫它。
void Foo() {
std::unique_ptr<Spam> spam = Spam::create(10);
...
}
在您的示例中,Foo()
是一个 friend
,但创建Spam
的不是函数 - make_unique
在内部调用new Spam
本身。简单的解决方法是直接Foo()
实际构造Spam
:
void Foo() {
std::unique_ptr<Spam> spam(new Spam(10));
}
相关文章:
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 如何更改唯一指针向量的可见性
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- 使用 RTTI 克隆唯一指针的向量
- 为什么我无法创建唯一指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 将唯一指针的指针传递给采用双指针的函数
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- C++唯一指针的向量
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 指向基类的唯一指针
- 添加要映射的对象的唯一指针
- 智能指针(唯一指针)和引用
- 唯一指针是否在堆或堆栈上分配内存?
- 尝试设置唯一指针布尔数组的值时BAD_ACCESS错误
- 使用唯一指针调用函数会使我的程序崩溃
- 将唯一指针插入std::映射