gpt4 book ai didi

c++ - 如何使具有非平凡成员的类 union 正常工作?

转载 作者:行者123 更新时间:2023-11-28 05:36:56 25 4
gpt4 key购买 nike

在尝试使用具有非平凡析构函数工作的成员创建类 union 类时,我遇到了两个问题。一个我无法理解的段错误和一种我无法弄清楚的有条件地调用非平凡析构函数的方法。

#include <iostream>
#include <string>

using namespace std;

class A {
struct B {
int u;
double v;
string w;
};
union C {
B x;
unsigned char y;
C(int u, double v, const string& w) {
x.w = w;// why does it segfault here?
x.u = u;
x.v = v;
}
C(unsigned char c) {
y = c;
}
//omitting this complains because string has non-trivial destructor
~C() {
// how to call this conditionally based on A::isChar value
//x.w.~string();
}
} c;
bool isChar;
public:
A(unsigned char f)
: isChar{true}, c(f) {}

A(int g, double h, const string& i)
: isChar{false}, c(g, h, i) {}

friend ostream& operator<<(ostream& os, const A& a) {
if(a.isChar)
return os << a.c.y;
return os << a.c.x.u << " " << a.c.x.v << " " << a.c.x.w;
}
};

int main() {
A a1(10, 20.0, "samik"), a2('v');
cout << a1 << " " << a2 << endl;
return 0;
}

我正在使用 gcc 5.3.1 使用 g++ -g -std=c++14 -pedantic union_class_test.cpp -o union_class_test.out 编译它。如何正确实现?

最佳答案

程序出现段错误

x.w = w;// why does it segfault here?

因为 x 还没有被构建,并且 x.w 包含垃圾。您需要确保首先调用 B 的构造函数。

    C(int u, double v, const string& w) : x()
{
x.w = w;// why does it segfault here?
x.u = u;
x.v = v;
}

为了正确地析构,您需要在 A 的析构函数中进行。将 C::~C 留空,并为 A 添加一个析构函数。

~A()
{
if (!isChar)
{
c.x.w.~string();
}
}

复制 A 时也需要小心,因为有时需要调用字符串的析构函数,有时则不需要。一种方法是使用 placement new 来覆盖 this,并且可以像这样实现......

A& operator=(const A& o)
{
if (this != &o)
{
this->~A();

if (o.isChar)
{
new (this) A(o.c.y);
}
else
{
new (this) A(o.c.x.u, o.c.x.v, o.c.x.w);
}
}

return *this;
}

并且,移动将以类似方式实现。但我会将其作为练习留给读者。

关于c++ - 如何使具有非平凡成员的类 union 正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38056858/

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