gpt4 book ai didi

c++ - 构造函数初始化函数成员实例化

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

MCVE

#include <map>
class A{
public:
A(int){

}
};

class B : public A{
public:
B()
: A(filter()){}
int filter(){
std::map<int,int> aStuff;
//new(&m_aStuff)std::map<int,int>;
m_aStuff = aStuff;
return 0;
}
private:
std::map<int,int> m_aStuff;
};

int main(){
B b;
return 0;
}

这在编译时失败了,因为 m_aStuff 没有被初始化。使用 answer我加了

new(&m_aStuff)std::map<int,int>;

如果您取消注释该行,它会在编译时运行,但是当您离开过滤器类时,m_aStuff 无论如何都会重新初始化。

最佳答案

我强烈建议您重新考虑设计,但这是我的解决方案:

class A {
public:
A(int) {}
};

class B : public A {
public:
struct Dirty {
std::map<int, int> map;
};

B(Dirty dirt = Dirty()) : A(filter(dirt)), m_aStuff(std::move(dirt.map)) {}
int filter(Dirty& dirt) {
std::map<int, int> aStuff;
//new(&m_aStuff)std::map<int,int>;
dirt.map = aStuff;
return 0;
}

private:
std::map<int, int> m_aStuff;
};

int main() {
B b;
return 0;
}

更好的解决方案:

class B : public A {
public:
B() : B(filter()) {}

private:
B(std::tuple<int, std::map<int, int>> t)
: A(std::get<0>(t)), m_aStuff(std::move(std::get<1>(t))) {}

static std::tuple<int, std::map<int, int>> filter() {
std::map<int, int> aStuff;
//new(&m_aStuff)std::map<int,int>;
return make_tuple(0, aStuff);
}

std::map<int, int> m_aStuff;
};

关于c++ - 构造函数初始化函数成员实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394707/

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