gpt4 book ai didi

c++ - 当参数在初始化列表时不可用时如何初始化成员对象?

转载 作者:行者123 更新时间:2023-11-30 01:03:52 24 4
gpt4 key购买 nike

目前的结构是这样的

class B {
//no default constructor
//this is a class in a third-party library, can't be modified
B(Lots ofData, AndOther arguments);
}

class A {
B b;

A(some_parameters){
//Do a lot of stuff with those parameters, make Results
B b(Results, Results); //ERROR
}
}

所以,我需要在 B 上调用构造函数,但我没有足够早的信息来在初始化列表中执行此操作。稍后如何调用 B 上的构造函数?因为 B 没有简单的构造函数,所以我也无法使用一些愚蠢的默认值进行精确初始化并在以后覆盖它。

我无法更改 B 类。

最佳答案

如果B有一个复制/移动构造函数,你可以简单地创建一个函数返回一个 B并使用它来初始化成员,如下所示:

B makeB(some_parameters) {
//Do a lot of stuff with those parameters, make Results
return B(Results, Results);
}

class A {
B b;

A(some_parameters)
: b(makeB(some_parameters))
{
}
};

如果复制/移动 B进入你的成员不是一个选项,那么一个简单的解决方案就是只分配 B对象动态。这样你就可以将所有“很多东西,产生结果”移动到一个函数中

#include <memory>

std::unique_ptr<B> makeB(some_parameters) {
//Do a lot of stuff with those parameters, make Results
return std::make_unique<B>(Results, Results);
}

class A {
std::unique_ptr<B> b;

A(some_parameters)
: b(makeB(some_parameters))
{
}
};

如果你想要你的 B直接住在A里面对象,你可以使用 std::optional<B> 或稍后放置对象的未命名 union :

#include <memory>

class A {
union {
B b;
};

A(some_parameters) {
//Do a lot of stuff with those parameters, make Results
new (&b) B(Results, Results);
}

~A() { // this is only needed if B has a non-trivial destructor
b.~B();
}
};

关于c++ - 当参数在初始化列表时不可用时如何初始化成员对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51717474/

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