如何在C ++中传递类的字段的地址

时间:2014-07-22 14:54:34

标签: c++

我正在尝试解决如何执行此操作,因此我有一个名为myClass的示例类:

//In myClass.h
Class myClass
{
    private:

    GLuint id;
};

//In myClass.cpp, in one of the functions
glGenBuffers(1, &myClass::id);

因此glGenBuffers希望GLuint的地址分配缓冲区的ID,但是当我尝试这样做时,我得到了编译错误:

无法转换' GLuint myClass :: *'到' GLuint *'在论证传递中

3 个答案:

答案 0 :(得分:4)

  

//在myClass.cpp中,在其中一个函数

如果你的意思是myClass的非static成员函数中的一个,那么你可以简单地说:

glGenBuffers(1, &id);

答案 1 :(得分:3)

如果从myClass的非静态成员函数中调用,则可以原谅期望这个工作。例如,这有效:

GLuint x = myClass::id;

更神秘的是,这也有效:

glGenBuffers(1, &(myClass::id));

类似地:

GLuint *p = &myClass::id;   // Doesn't work!
GLuint *p = &(myClass::id); // Works!

John Dibling写道,一般来说,解决方案只是省略范围限定符:

GLuint x = id;
glGenBuffers(1, &id);

但是,如果您尝试访问具有相同名称的基类中的成员,则此方法无效。那么&myClass::id&(myClass::id)之间有什么区别?我希望我能告诉你,但我无法理解!范围运算符::具有所有C ++运算符的最高优先级,因此我希望它们是等价的。任何人都可以帮我吗?

编辑添加:好的,这一切都有些道理。在标准草案N3337 for C ++ 0x中,它说:

  

一元&运算符的结果是指向其操作数的指针。该   操作数应为左值或 qualified-id 。如果操作数是a    qualified-id 命名类型为m的某个类C的非静态成员T,结果的类型为“指向类{{1}成员的指针类型的   C“并且是指定T的prvalue。否则...

然后你去查看 qualified_id 是什么,事实证明如果你把它放在括号中,它就不再是 qualified_id 了。这解释了一切。

答案 2 :(得分:0)

首先,您需要了解类和对象之间的区别。 类是蓝图,对象是类的实例 - 即可以操作的实际事物。 (类似于饼干切割器和饼干 - 切割器只提供饼干的形状,一旦你从一大堆面团中切出一个,两个或许多饼干)

所以..你要么必须实例化一个对象来访问id,要么你必须指定有一个'全局' id使用static关键字。