确定对象的"所有者"

Determine the 'owner' of an object

本文关键字:所有者 对象      更新时间:2024-09-22

我想确定哪个对象拥有其他对象。我遇到的情况与下面的代码类似。填补空白,它进行了编译,似乎达到了我的预期——但总的来说,这会奏效吗?有什么惯用的方法吗?还是完全不明智?

#include <functional>
#include <vector>
#include <iostream>
using namespace std;
struct A { int blah; /* ... */ };
struct B : A { /* ... */ };
struct C { vector<A> as{{}}; /*.. */ };
struct D { vector<C> cs{{}}; /*.. */ };
const A& superFoo(vector<reference_wrapper<const A>> alsoa) { alsoa.back();}
int main() {
B b{};
D d{};
const A& ds_a = /* Some selected 'a' from 'd' */;
vector<reference_wrapper<const A>> sfIn = {ref(b), ref(dads)};
auto out = superFoo(sfIn){ /* Some special selection process, based on A's attributes. */};
void* address = reinterpret_cast<void*>(&out);

/* Here I want to attribute which object, b or d, 'owns' the returned 'a' - 'out' */
if (address < reinterpret_cast<void*>(&b) + sizeof(b) &&
address >= reinterpret_cast<void*>(&b)) 
{ cout<< "b";
if (address < reinterpret_cast<void*>(&d) + sizeof(D) &&
address >= reinterpret_cast<void*>(&b)) 
{ cout<< "d"; }
}

问题是结构A到D中的每一个都是在内存中合成的。老实说,这里真正的问题是,你到底是如何从一开始就想出你要喂给超级食物的指针的?如果它来自你的一个对象,那么你可以不把它标记为这样吗。

这确实是一个设计问题。一般来说,C++的设计并不是为了确定对象是否在特定的图中,但如果必须这样做,那么:

为了正确地做到这一点,你需要定义这样的东西:

(警告,这太离谱了(

struct PlainOldDataOnly
{ 
bool isMe(char *x) { return x >= (char *)this && x < (char *)this + sizeof(PlainOldDataOnly); }
}
struct HasVectors : PlainOldDataOnly
{
vector<myPlainOldData> stuff;
bool isMe(char *x) { return PlainOldDataOnly::isMe(x) || (x >= (char *)stuff.data() && x < (char *)(stuff.data() + stuff.size()); }
}

注意,在HasVectors中,你必须为每个向量都有这样的东西结构,然后,它只能在以下条件下工作:

a( 矢量仅由普通的旧数据组成。b( 矢量的大小不会调整。

正如其他人所说,这是非常脆弱的代码。当你把地图、字符串或其他东西放进向量中的对象时,你就会遇到问题。这将是一个真正的痛苦维持。