确定对象的"所有者"
Determine the 'owner' of an object
我想确定哪个对象拥有其他对象。我遇到的情况与下面的代码类似。填补空白,它进行了编译,似乎达到了我的预期——但总的来说,这会奏效吗?有什么惯用的方法吗?还是完全不明智?
#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( 矢量的大小不会调整。
正如其他人所说,这是非常脆弱的代码。当你把地图、字符串或其他东西放进向量中的对象时,你就会遇到问题。这将是一个真正的痛苦维持。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 堆分配的对象是否存在永不为空的唯一所有者?
- 如何在拥有的C++对象中安全地存储对所有者的引用?
- 如何为生存时间少于对象所有者的类组织对象所有权?
- 设计以访问对象所有者的元素
- 如何知道对象的所有者类
- 嵌套类对象的所有者
- 使用offsetof()从成员变量中获取所有者对象
- 获取预先创建的值的所有者对象?设计错误
- 在Google c++风格指南中引用的对象所有者是什么?
- 试图在Windows中更改互斥对象的所有者
- C++:对象通知其所有者销毁自身的通用方法