【问题标题】:How Convert member pointer to englobing class (or struct) pointer [duplicate]如何将成员指针转换为 englobing 类(或结构)指针
【发布时间】:2020-11-09 21:11:38
【问题描述】:

我有以下数据设计:

struct Info {
    int i;
};

struct Data {
    long data;
}


struct C {
    Info I;
    Data d;
};

int main() {
    C c;
    Data* d=&(c.d);
    C* getOuterC(d);
}

现在我有一个指向数据 (Data*) 的指针,我知道它位于 C 结构中。我想要一个函数 C* getOuterC(Data*) 函数返回一个指向包含数据的外部C 结构的C 指针(C*)。有什么想法吗?

【问题讨论】:

  • 正确的方式?有一个指向数据结构内部的外部指针。疯狂、危险并依赖于实施细节?将指针值计算为d - sizeof(Info)
  • stackoverflow.com/questions/142016/c-c-structure-offset -- 请注意,在 C++ 中,对 offsetof 的支持取决于实现。如果你认为你需要这个并且你必须在 Stack Overflow 上询问它,我断言你不需要它并且你的设计有问题。
  • 如果不使用一些有问题的方法,我认为这是不可能的,但您可以更改 Data 使其指向其父 C
  • 顺便说一下,该副本中接受的答案的行为是未定义的(指针算法仅在数组中有效)。
  • @Bathsheba 有一个提案(我上次检查过)在进行中(我上次检查过),以使其在对象中有效,即采用表明对象可以被视为“数组unsigned char'(或者,现在,std::byte)并通过在标准中的其他地方不与它相矛盾来实际使用它。或者至少,这就是我记得的!

标签: c++


【解决方案1】:

没有可移植的方式来做你想做的事,除非你以某种方式改变基类。

一种解决方案是使 InfoData 多态类型:通过在两者中引入虚拟析构函数来做到这一点:

struct Info {
    virtual ~Info() = default;
    int i;
};

Data 类似。

然后你重构C如下:

struct C : Info, Data
{
};

然后,如果您有指向其中一个的指针(或引用),则可以访问另一个,以及带有dynamic_cast 的基类C。这将构成您要编写的函数的基础。

【讨论】:

  • 当然,现在看起来。至少......一个可以做到这一点,但如果我在现实生活中看到它,我会反对它,因为继承很少是一种解决方案,而且这闻起来可能是一个 XY 问题。跨度>
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2016-10-10
相关资源
最近更新 更多