我正在尝试解决如何执行此操作,因此我有一个名为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 *'在论证传递中
答案 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关键字。