Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;记忆中的工会_C++_Unions - Fatal编程技术网

C++ C++;记忆中的工会

C++ C++;记忆中的工会,c++,unions,C++,Unions,我正在处理如下代码: union Data { int i; double x; std::string str; ~Data(){} }; union Data var = {.x = 31293.932}; std::cout << var.x << "\n"; std::cout << var.str << "\n"; std::cout << var.i << "\n"; 联合

我正在处理如下代码:

union Data { 
    int i;
    double x;
    std::string str;
    ~Data(){}
};

union Data var = {.x = 31293.932};

std::cout << var.x << "\n";
std::cout << var.str << "\n";
std::cout << var.i << "\n";
联合数据{
int i;
双x;
std::字符串str;
~Data(){}
};
联合数据变量={.x=31293.932};

std::cout
str
未构造。如果必须使用
str
,则必须为其提供构造函数或通过新的位置构造它。下面是一个完整的例子

#include <iostream>
#include <vector>

using namespace std;

union Data
{
    int i;
    double x;
    std::string str;
    Data() {}
    Data(std::string st) : str(st) {}
    ~Data() {}
};

int main()
{
    Data var;
    var.x = 31293.932;
    new (&var.str) std::string("Hello World!");


    std::cout << var.x << "\n";
    std::cout << var.str << "\n";
    std::cout << var.i << "\n";

//destroy it
    var.str.std::string::~string();
}
#包括
#包括
使用名称空间std;
联合数据
{
int i;
双x;
std::字符串str;
数据(){}
数据(std::string st):str(st){
~Data(){}
};
int main()
{
数据变量;
var.x=31293.932;
新建(&var.str)std::string(“你好,世界!”);

std::cout
str
未构造。如果必须使用
str
,则必须为其提供构造函数或通过placement new构造。下面是完整示例

#include <iostream>
#include <vector>

using namespace std;

union Data
{
    int i;
    double x;
    std::string str;
    Data() {}
    Data(std::string st) : str(st) {}
    ~Data() {}
};

int main()
{
    Data var;
    var.x = 31293.932;
    new (&var.str) std::string("Hello World!");


    std::cout << var.x << "\n";
    std::cout << var.str << "\n";
    std::cout << var.i << "\n";

//destroy it
    var.str.std::string::~string();
}
#包括
#包括
使用名称空间std;
联合数据
{
int i;
双x;
std::字符串str;
数据(){}
数据(std::string st):str(st){
~Data(){}
};
int main()
{
数据变量;
var.x=31293.932;
新建(&var.str)std::string(“你好,世界!”);

std::cout您应该使用
char
访问联合中的字节。
std::string
不是POD类型,不能以这种方式使用

请尝试以下方法:

union Data { 
    int i;
    double x;
    char bytes[sizeof(double)];
    ~Data(){}
};

union Data var = {.x = 31293.932};

std::cout << var.x << "\n";
std::cout.write(var.bytes, sizeof(var.bytes));
std::cout << "\n" << var.i << "\n";
联合数据{
int i;
双x;
字符字节[sizeof(double)];
~Data(){}
};
联合数据变量={.x=31293.932};

std::cout您应该使用
char
访问联合中的字节。
std::string
不是POD类型,不能以这种方式使用

请尝试以下方法:

union Data { 
    int i;
    double x;
    char bytes[sizeof(double)];
    ~Data(){}
};

union Data var = {.x = 31293.932};

std::cout << var.x << "\n";
std::cout.write(var.bytes, sizeof(var.bytes));
std::cout << "\n" << var.i << "\n";
联合数据{
int i;
双x;
字符字节[sizeof(double)];
~Data(){}
};
联合数据变量={.x=31293.932};

std::cout基本上,将一堆字节扔进内存插槽,并希望您能将这些字节视为有效的
std::string
对象,这会导致灾难。您希望将成员放入联合体中会神奇地使他们能够从任何数据类型转换为任何其他数据类型,而这不是事情的工作方式。基本上,th将一堆字节排到内存插槽中,并希望您可以将这些字节视为有效的
std::string
对象,这会导致灾难。您希望将成员放入联合会,这会神奇地使他们能够从任何数据类型转换为任何其他数据类型,而这不是工作方式。建议快速扩展POD(普通的旧数据)帮助可怜的新手。@user4581301虽然POD的完整定义相当复杂,但这是一个很好的建议。不过,我添加了一些关于它的简介,以帮助别人开始。建议快速扩展POD(普通的旧数据)帮助可怜的新手。@user4581301很好的建议,尽管POD的完整定义相当复杂。不过,我添加了一点关于它的简介,让别人开始了解它。“new(&var.str)std::string(“Hello World!”);“真的有什么作用?它是否分配大小为“Hello World!”的内存或者它只是调用构造函数来获取数据?值得补充的是,由于
i
x
str
在内存中共享相同的空间,在设置
str
后分配给
i
x
将损坏
str
,并可能使其无法恢复。@meguli这是一个新的位置。请阅读更多信息:什么“new(&var.str)std::string(“helloworld!”);”真的吗?它是否分配大小为“helloworld!”的内存或者它只是调用构造函数获取数据?值得补充的是,由于
i
x
str
在内存中共享相同的空间,在设置
str
后分配给
i
x
将损坏
str
,并可能使其无法恢复。@meguli这是一个新的位置。请阅读更多信息: