gpt4 book ai didi

c++ - 当相关的构造函数是私有(private)的时,如何在堆上返回一个类实例?

转载 作者:行者123 更新时间:2023-12-04 12:04:14 26 4
gpt4 key购买 nike

假设我有这个结构

struct MyStruct {

static MyStruct Create(int x) {
return { x*2, x>3 };
}

MyStruct(const MyStruct& c) = delete; // no copy c'tor

private:
MyStruct(int a_, bool b_) : a(a_), b(b_) {} // private c'tor -- can't use new

const int a;
const bool b;
};
编辑:我删除了复制构造函数。这是我的代码库中的一些类的简化示例,它们没有复制 c'tors。
我可以像这样在堆栈上获取一个实例:
int main() {
auto foo = MyStruct::Create(2);
return 0;
}
但是假设我需要一个指针(或者 unique_ptr 很好),并且我无法更改 MyStruct 的实现, 我怎样才能做到这一点?

最佳答案

你可以包装 MyStruct在另一个类中,它有一个 MyStruct成员。这是一个最小版本:

class Wrapper {
public:
MyStruct ms;
Wrapper(int x) : ms(MyStruct::Create(x)) { }
};
您可以像这样使用:
int main() {
MyStruct::Create(2);
std::make_unique<Wrapper>(2);
}
此代码 will not trigger any copies nor moves - 因为复制省略(见: What are copy elision and return value optimization? )。
然后,您可以将您喜欢的任何其他构造函数和方法添加到此类包装器中,可能会将某些方法调用转发到 ms。成员。有些人可能会选择制作 ms protected 或私有(private)。

关于c++ - 当相关的构造函数是私有(private)的时,如何在堆上返回一个类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69487305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com