C++ C++;成员变量的偏移量?

C++ C++;成员变量的偏移量?,c++,C++,我有: 现在,我想知道给定一个Foo的a,b,s,d的偏移量* 也就是说,假设我有: class Foo { int a; int b; std::string s; char d; }; 我不知道你为什么想要一个成员到你的结构的偏移量,但是偏移量是一种允许在给定结构地址的情况下获取指向成员的指针的东西。(请注意,标准的offsetof宏仅适用于POD结构(您的不是),因此在这里不是合适的答案。) 如果这是您想要做的,我建议使用指向成员的指针,因为这是一种更便于携带的技术。e、

我有:

现在,我想知道给定一个Foo的a,b,s,d的偏移量*

也就是说,假设我有:

class Foo {
  int a;
  int b;
  std::string s;
  char d;
};

我不知道你为什么想要一个成员到你的
结构的偏移量,但是偏移量是一种允许在给定结构地址的情况下获取指向成员的指针的东西。(请注意,标准的
offsetof
宏仅适用于POD结构(您的不是),因此在这里不是合适的答案。)

如果这是您想要做的,我建议使用指向成员的指针,因为这是一种更便于携带的技术。e、 g

Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ; // what expression should I put in ?

请注意,只有当
b
Foo
中不是私有的,或者您可以在成员函数或
Foo

的友元中形成指向成员的指针。您应该考虑到结构内部的偏移量依赖于编译器。不同的编译器不仅可以在结构的末尾放置填充零点,也可以在结构的中间放置填充(尽管我认识到这一点比较少见)。也就是说,直接使用偏移量而不是以“标准方式”访问成员的结果是未定义的行为

查尔斯·巴利给出的解决方案更为明智。无论如何,我不太明白你的问题的最终目的是什么。具体来说,

int main()
{
    int Foo::* pm = &Foo::b;

    // Pointer to Foo somewhere else in the program
    extern Foo* f;

    int* p = &(f->*pm);
}
对我来说毫无意义。是否要将其自身在foo内的偏移量指定给foo->b

也许您正在尝试使用foo中的b作为char*,在这种情况下,问题是:

Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ;
也许您有时想将b视为int,有时想将b视为char*,在这种情况下,您可以尝试进行以下更改(假设您只是忘记将其公开):


为什么要这样?什么时候需要,编译时还是运行时?你的意思是让成员私有化吗?(你不应该要求这样做来规避访问说明符。)-看看这是否有帮助!我不能想到一个令人信服的理由,C++标准匠将OffStod限制为POD类型,但是它似乎通过许多编译器产生预期的结果。因此,它可能会工作,但将不可移植。@Dan,事实上,C++0x允许将其应用于非POD,只要该类型是标准布局类型。
Foo *foo = new Foo();
char* ptr == (char*) foo + ?? ;
class Foo {
public:
    int a;
    union b {
        int intB;
        char * chrB;
    }
    int c;
    // ...
};