当前位置:  开发笔记 > 编程语言 > 正文

指针到"内部结构"成员是否被禁止?

如何解决《指针到"内部结构"成员是否被禁止?》经验,为你挑选了2个好方法。

我有一个嵌套的结构,我想有一个嵌入成员之一的指向成员的指针:

这合法吗?

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系统.对于每个指定的类,我们保留一个"Property"数组,包括一个Ptr-to-member它的用法如下:

//somewhere else in code...
( myBaseClassWithCustomRTTIPointer)->* toto = true;

Jerry Coffin.. 19

您关心的InnerStruct恰好包含在MyStruct的一个实例中,但这并不影响您获取指向InnerStruct成员的指针的方式.

bool InnerStruct::* toto2 = &InnerStruct::c;

编辑:重读你的问题,我猜你想要定义一个指向外部结构成员的指针,并让它直接指向内部结构的一个成员.这根本不允许.要获取包含在外部结构中的内部结构的成员,您必须创建指向内部结构itselft的指针,然后创建指向其成员的指针.要使用它,您可以取消引用指向成员的两个指针:

// Pointer to inner member of MyStruct:
InnerStruct MyStruct::* toto = &MyStruct::inner;

// Pointer to c member of InnerStruct:
bool InnerStruct::* toto2 = &InnerStruct::c;

// Dereference both to get to the actual bool:
bool x = mystruct.*toto.*toto2;


AnT.. 19

是的,这是禁止的.你并不是第一个提出这个完美逻辑思想的人.在我看来,这是C++中指向成员的规范中明显的"错误"/"遗漏"之一,但显然委员会没有兴趣进一步开发指向成员的指针(如同大多数"低级"语言功能的情况).

请注意,在语言中已经实现了该功能所需的一切.指向a-data-of-a-member的指针与指向直接数据成员的指针完全不同.唯一缺少的是初始化这种指针的语法.但是,委员会显然对引入这样的语法不感兴趣.

从纯粹的形式逻辑的角度来看,这应该是在C++中允许的

struct Inner {
  int i;
  int j[10];
};

struct Outer {
  int i;
  int j[10];
  Inner inner;
};

Outer o;
int Outer::*p;

p = &Outer::i; // OK
o.*p = 0; // sets `o.i` to 0

p = &Outer::inner.i; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.i` to 0

p = &Outer::j[0]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[0]` to 0
// This could have been used to implement something akin to "array type decay" 
// for member pointers

p = &Outer::j[3]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[3]` to 0

p = &Outer::inner.j[5]; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.j[5]` to 0

指向数据成员的典型实现只不过是成员从封闭对象开头的字节偏移量.由于所有成员(直接成员和成员成员)最终按顺序排列在内存中,因此成员的成员也可以通过特定的偏移值来识别.这就是我的意思,当我说这个功能的内部工作已经完全实现时,所需要的只是初始化语法.

在C语言中,此功能通过标准offsetof宏获得的显式偏移来模拟.并且在CI中可以获得offsetof(Outer, inner.i)offsetof(Outer, j[2]).不幸的是,这种能力并没有反映在C++指针到数据成员中.



1> Jerry Coffin..:

您关心的InnerStruct恰好包含在MyStruct的一个实例中,但这并不影响您获取指向InnerStruct成员的指针的方式.

bool InnerStruct::* toto2 = &InnerStruct::c;

编辑:重读你的问题,我猜你想要定义一个指向外部结构成员的指针,并让它直接指向内部结构的一个成员.这根本不允许.要获取包含在外部结构中的内部结构的成员,您必须创建指向内部结构itselft的指针,然后创建指向其成员的指针.要使用它,您可以取消引用指向成员的两个指针:

// Pointer to inner member of MyStruct:
InnerStruct MyStruct::* toto = &MyStruct::inner;

// Pointer to c member of InnerStruct:
bool InnerStruct::* toto2 = &InnerStruct::c;

// Dereference both to get to the actual bool:
bool x = mystruct.*toto.*toto2;



2> AnT..:

是的,这是禁止的.你并不是第一个提出这个完美逻辑思想的人.在我看来,这是C++中指向成员的规范中明显的"错误"/"遗漏"之一,但显然委员会没有兴趣进一步开发指向成员的指针(如同大多数"低级"语言功能的情况).

请注意,在语言中已经实现了该功能所需的一切.指向a-data-of-a-member的指针与指向直接数据成员的指针完全不同.唯一缺少的是初始化这种指针的语法.但是,委员会显然对引入这样的语法不感兴趣.

从纯粹的形式逻辑的角度来看,这应该是在C++中允许的

struct Inner {
  int i;
  int j[10];
};

struct Outer {
  int i;
  int j[10];
  Inner inner;
};

Outer o;
int Outer::*p;

p = &Outer::i; // OK
o.*p = 0; // sets `o.i` to 0

p = &Outer::inner.i; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.i` to 0

p = &Outer::j[0]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[0]` to 0
// This could have been used to implement something akin to "array type decay" 
// for member pointers

p = &Outer::j[3]; // ERROR, but should have been supported
o.*p = 0; // sets `o.j[3]` to 0

p = &Outer::inner.j[5]; // ERROR, but should have been supported
o.*p = 0; // sets `o.inner.j[5]` to 0

指向数据成员的典型实现只不过是成员从封闭对象开头的字节偏移量.由于所有成员(直接成员和成员成员)最终按顺序排列在内存中,因此成员的成员也可以通过特定的偏移值来识别.这就是我的意思,当我说这个功能的内部工作已经完全实现时,所需要的只是初始化语法.

在C语言中,此功能通过标准offsetof宏获得的显式偏移来模拟.并且在CI中可以获得offsetof(Outer, inner.i)offsetof(Outer, j[2]).不幸的是,这种能力并没有反映在C++指针到数据成员中.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有