【发布时间】:2009-12-18 18:20:29
【问题描述】:
我有一个嵌套结构,我想要一个指向嵌套成员之一的成员指针:
合法吗?
struct InnerStruct
{
bool c;
};
struct MyStruct {
bool t;
bool b;
InnerStruct inner;
};
这个:
MyStruct mystruct;
//...
bool MyStruct::* toto = &MyStruct::b;
没问题,但是:
bool MyStruct::* toto = &MyStruct::inner.c;
不是。有什么想法吗?
谢谢
这里有一些细节 是的,它是 &MyStruct::b 而不是 mystruct::b; 该代码来自自定义 RTTI/Property 系统。 对于每个指定的类,我们保留一个“属性”数组,包括一个 Ptr-to-member 它是这样使用的:
//somewhere else in code...
( myBaseClassWithCustomRTTIPointer)->* toto = true;
【问题讨论】:
-
我很困惑:你的意思是在你的引用中指的是 MyStruct::b 和 MyStruct::inner.c 与 mystruct.b 和 mystruct.inner.c 吗?您在两个作业中指定 MyStruct::* 的目标是什么?
-
我认为他想做
(mystruct.*(&MyStruct::inner.c)) = true并让它与mystruct.inner.c = true相同。 -
@Joe:C++ 中指向数据成员的指针只不过是“偏移”概念的语言级实现。 IE。在内部,指向数据成员的指针只不过是成员相对于整个对象开头的偏移量。显然,子对象的成员在整个对象中也有自己的偏移量,因此允许
bool MyStruct::*类型的指针指向MyStruct::InnerStruct成员是完全合乎逻辑的,就像在 OP 的示例中一样。但是,语言不允许这样做。根本没有语法。 -
感谢大家快速准确的回答。我认为 ptr-to-member 比仅仅从基类偏移要复杂一些,因为它可以处理多重继承和虚拟继承。我可能会更改我的属性系统,使其使用 offsetof 并禁止“可怕的钻石”
-
@benoitj:不,你把事情复杂化了。只有指向成员函数的指针才会出现多重继承、虚拟继承和各种“钻石”的问题。使用指向数据成员的指针不存在这样的复杂性。指向数据成员的指针要简单得多。是的,指向数据成员 is 的指针只是一个偏移量(在典型实现中)。