指向成员函数的指针
Pointer to a member function
有结构
struct Person{
Person( int i , int g):id(i),age(g){};
int id;
int age;
};
我可以通过将指向成员数据的指针作为参数传递给函数来动态 return 成员数据。例如
int extract( Person * p , int Person::* param)
{
return p ->*param;
}
并使用
调用
Person *p = new Person (10 , 20 );
cout << extract(p , &Person::id )<< endl;
但我的问题是,为什么这样做有效?我们传递的 &Person::id
基本上是 memory ,但是 Person 是一个违反定义的右值。
感谢所有对我可能对主题的误解的解释/澄清。
谢谢
C++中成员指针可以理解为"offset"定义。虽然当你有虚函数等时会有些复杂,但在你的情况下这已经足够了。
因此,基本上您的代码就像(如果我们将数据类型转换为 "raw" 数据)
int extract(void *p, int offset)
{
return *((int*)(p+offset));
}
(从技术上讲,上面的代码是无法编译的,因为 void *
指针不能用于加法表达式,因为编译器不知道指针的大小,但我们暂时忽略它。 )
当你调用它时,代码看起来像
extract(p, __offsetof(Person, id));
其中__offsetof
是一个伪运算符,编译器会在编译时计算它。
你可以看到这里没有魔法。 C++ 可以帮助您的是偏移量在特殊数据类型中受到保护,因此您不能更改其内部,从而避免破坏。
有关 C/C++ 指针转换和算术的其他信息
上面的代码对于 C/C++ 用户来说是非常基础的,尽管它不是 C++ 专业人士希望看到的形式(应使用 static_cast
或 reinterpret_cast
而不是C 型铸造)。
我看到提问者进一步解释了 C/C++ 指针算法,这有点离题,因为它与这里提出的问题无关,所以我进一步给出一些有关此主题的参考。
Pointer Arithmetic
http://www.technoplaza.net/programming/lesson9p2.php
http://www.informit.com/articles/article.aspx?p=686170&seqNum=8
有结构
struct Person{
Person( int i , int g):id(i),age(g){};
int id;
int age;
};
我可以通过将指向成员数据的指针作为参数传递给函数来动态 return 成员数据。例如
int extract( Person * p , int Person::* param)
{
return p ->*param;
}
并使用
调用Person *p = new Person (10 , 20 );
cout << extract(p , &Person::id )<< endl;
但我的问题是,为什么这样做有效?我们传递的 &Person::id
基本上是 memory ,但是 Person 是一个违反定义的右值。
感谢所有对我可能对主题的误解的解释/澄清。 谢谢
C++中成员指针可以理解为"offset"定义。虽然当你有虚函数等时会有些复杂,但在你的情况下这已经足够了。
因此,基本上您的代码就像(如果我们将数据类型转换为 "raw" 数据)
int extract(void *p, int offset)
{
return *((int*)(p+offset));
}
(从技术上讲,上面的代码是无法编译的,因为 void *
指针不能用于加法表达式,因为编译器不知道指针的大小,但我们暂时忽略它。 )
当你调用它时,代码看起来像
extract(p, __offsetof(Person, id));
其中__offsetof
是一个伪运算符,编译器会在编译时计算它。
你可以看到这里没有魔法。 C++ 可以帮助您的是偏移量在特殊数据类型中受到保护,因此您不能更改其内部,从而避免破坏。
有关 C/C++ 指针转换和算术的其他信息
上面的代码对于 C/C++ 用户来说是非常基础的,尽管它不是 C++ 专业人士希望看到的形式(应使用 static_cast
或 reinterpret_cast
而不是C 型铸造)。
我看到提问者进一步解释了 C/C++ 指针算法,这有点离题,因为它与这里提出的问题无关,所以我进一步给出一些有关此主题的参考。
Pointer Arithmetic
http://www.technoplaza.net/programming/lesson9p2.php
http://www.informit.com/articles/article.aspx?p=686170&seqNum=8