gpt4 book ai didi

c++ - 如何为具有内部放置 new 的类实现安全复制构造函数(使用 std::string)

转载 作者:行者123 更新时间:2023-11-28 08:17:51 24 4
gpt4 key购买 nike

这是我的代码:

struct RS_Token
{
char id;
char cleanup;
unsigned char array[sizeof (std::string) > sizeof (double) ? sizeof (std::string) : sizeof (double)];

RS_Token(int a) :
id(a),
cleanup(0)
{
}
RS_Token(int a, const char* pstr) : // identifier or text
id(a),
cleanup(1)
{
new (array) std::basic_string<unsigned char>((unsigned char*)pstr);
}
RS_Token(int a, int b) : // integer
id(a),
cleanup(0)
{
new (array) int(b);
}
RS_Token(int a, double b) : // float (double)
id(a),
cleanup(0)
{
new (array) double(b);
}

~RS_Token()
{
if (cleanup)
{
std::basic_string<unsigned char>* p = reinterpret_cast<std::basic_string<unsigned char>*>(array);

p->~basic_string();
}
}
};

任何关于如何添加一个复制构造函数以正确处理内部分配 std::string 的情况的建议,我们将不胜感激。

最佳答案

我不确定你所做的是否是一个好的设计,但是为了回答你关于 placement-new 的问题:你像在任何其他 new 表达式中一样提供构造函数参数:

构造新字符串:

typedef std::basic_string<unsigned char> ustring;

RS_Token(const char* pstr)
{
void * p = static_cast<void*>(array);
new (p) ustring(pstr, pstr + std::strlen(pstr));
}

复制构造:

RS_Token(const RS_Token & other)
{
void * p = static_cast<void*>(array);
new (p) ustring(*reinterpret_cast<const ustring *>(other.array));
}

分配:

RS_Token & operator=(const RS_Token & other)
{
ustring & s = *reinterpret_cast<ustring *>(array);
s = *reinterpret_cast<const ustring *>(other.array);
return this;
}

关于c++ - 如何为具有内部放置 new 的类实现安全复制构造函数(使用 std::string),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039006/

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