gpt4 book ai didi

c++ - 如何让一个类总是在复制/移动时重建?

转载 作者:行者123 更新时间:2023-11-28 00:05:23 24 4
gpt4 key购买 nike

假设我有一个类 A,它包含一个指向包含它的类的指针,以及它的大小:

struct A
{
void* parent;
std::size_t size;
template<typename T> A(T* p) : parent(p), size(sizeof(T)) { }
};

这在其他类中使用如下:

struct B
{
A a { this };
};

到目前为止,还不错。但是当包含类被复制或移动时就会出现问题。 A 永远不会被重构,并且仍然指向 Bprevious 实例:

B b1;
B b2 = b1;
assert(b1.a.parent != b2.a.parent); // oops!

显而易见的解决方案是删除A 的复制和移动构造函数:

struct A
{
void* parent;
std::size_t size;
template<typename T> A(T* p) : parent(p), size(sizeof(T)) { }
A(const A&) = delete;
A(A&&) = delete;
};

...但这会迫使我在使用 A 的任何类中定义自定义复制/移动构造函数和 operator=。有没有更简单的方法来达到同样的效果?

编辑:我应该提到,A 对其父类占用的内存做了一些“肮脏”的把戏。它需要一个指向 parent 的指针,并且必须能够计算出它的大小。

最佳答案

存储 A 从其所有者开始的偏移量。

struct A
{
std::ptrdiff_t parent_offset;
template<typename T> A(T* p) : parent_offset(
reinterpret_cast<std::uintptr_t>(this) -
reinterpret_cast<std::uintptr_t>(p)
)
{}

void* parent() {
return reinterpret_cast<void*>(
reinterpret_cast<std::uintptr_t>(this) - parent_offset
);
}
};

关于c++ - 如何让一个类总是在复制/移动时重建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35961197/

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