gpt4 book ai didi

c++ - 指向成员函数的指针

转载 作者:可可西里 更新时间:2023-11-01 18:35:30 25 4
gpt4 key购买 nike

有结构

struct Person{
Person( int i , int g):id(i),age(g){};
int id;
int age;
};

我可以通过将指向成员数据的指针作为参数传递给函数来动态返回成员数据。例如

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++中指向member的指针可以理解为一个“偏移量”定义。虽然当你有虚函数等时会有一些复杂性,但在你的情况下这已经足够了。

所以,基本上您的代码就像(如果我们将数据类型转换为“原始”数据)

int extract(void *p, int offset)
{
return *((int*)(p+offset));
}

(从技术上讲,上面的代码是无法编译的,因为 void * 指针不能用于加法表达式,因为编译器不知道指针的大小,但让我们忽略它现在。)

当你调用它时,代码看起来像

extract(p, __offsetof(Person, id));

其中 __offsetof 是一个伪操作符,编译器会在编译时计算它。

你可以看到这里没有魔法。 C++ 可以帮助您的是,偏移量在特殊数据类型中受到保护,因此您不能更改其内部,从而避免分解。

有关 C/C++ 指针转换和算术的其他信息

上面的代码对于 C/C++ 用户来说是非常基础的,尽管它不是 C++ 专业人士希望看到的形式(应使用 static_castreinterpret_cast 而不是C 类型类型转换)。

我看到提问者进一步解释了 C/C++ 指针算法,这有点偏离主题,因为它与这里提出的问题无关,所以我给出了一些关于这个主题的进一步引用。

Pointer Arithmetic

http://www.technoplaza.net/programming/lesson9p2.php

http://www.informit.com/articles/article.aspx?p=686170&seqNum=8

关于c++ - 指向成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40475848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com