make_unique 无法访问静态成员中的私有构造函数
make_unique cannot access private constructor in static member
我的 class 具有以下结构:
class S {
public:
S() {}
};
class T {
private:
std::unique_ptr<S> a;
T(S);
public:
static std::unique_ptr<T> make_item() {
std::unique_ptr<S> s_instance = std::make_unique<S>();
return std::make_unique<T>(std::move(s_instance));
}
};
但是,当我尝试在 make_item 中创建 unique_ptr 时,它认为构造函数是私有的。
有没有办法允许在 class 本身的静态成员函数中使用私有构造函数?因为一个成员是unique_ptr到S(一个相当重的对象),所以我们不希望使用副本。
正如 yksisarvinen 在评论中提出的那样,解决此问题的方法是将 make_unique<T>
替换为 std::unique_ptr<T>(new T(S))
。
class S {
public:
S() {}
};
class T {
private:
std::unique_ptr<S> a;
T(S);
public:
static std::unique_ptr<T> make_item() {
// Create S
std::unique_ptr<S> s_instance = std::make_unique<S>();
return std::unique_ptr<T>(new T(s_instance));
}
};
可以将 make_unique 及其内部助手(如果有的话)声明为友元函数,这使得代码不可移植(如此处所述:)
或者使构造函数 public 但在其参数中添加私有元素,例如:
class S {
public:
S() {}
};
class T {
private:
struct Private
{
friend T;
private:
explicit Private() = default;
};
std::unique_ptr<S> a;
public:
T(S s, Private);
static std::unique_ptr<T> make_item() {
auto s_instance = std::make_unique<S>();
return std::make_unique<T>(std::move(s_instance), Private());
}
};
我的 class 具有以下结构:
class S {
public:
S() {}
};
class T {
private:
std::unique_ptr<S> a;
T(S);
public:
static std::unique_ptr<T> make_item() {
std::unique_ptr<S> s_instance = std::make_unique<S>();
return std::make_unique<T>(std::move(s_instance));
}
};
但是,当我尝试在 make_item 中创建 unique_ptr 时,它认为构造函数是私有的。
有没有办法允许在 class 本身的静态成员函数中使用私有构造函数?因为一个成员是unique_ptr到S(一个相当重的对象),所以我们不希望使用副本。
正如 yksisarvinen 在评论中提出的那样,解决此问题的方法是将 make_unique<T>
替换为 std::unique_ptr<T>(new T(S))
。
class S {
public:
S() {}
};
class T {
private:
std::unique_ptr<S> a;
T(S);
public:
static std::unique_ptr<T> make_item() {
// Create S
std::unique_ptr<S> s_instance = std::make_unique<S>();
return std::unique_ptr<T>(new T(s_instance));
}
};
可以将 make_unique 及其内部助手(如果有的话)声明为友元函数,这使得代码不可移植(如此处所述:
或者使构造函数 public 但在其参数中添加私有元素,例如:
class S {
public:
S() {}
};
class T {
private:
struct Private
{
friend T;
private:
explicit Private() = default;
};
std::unique_ptr<S> a;
public:
T(S s, Private);
static std::unique_ptr<T> make_item() {
auto s_instance = std::make_unique<S>();
return std::make_unique<T>(std::move(s_instance), Private());
}
};