2013-10-11 60 views
1

我有在我的课gTexture两个函数声明:简化重载类功能

public: 
           gTexture():mActiveTexture(0){...} 
    virtual void    DrawTexture(); 
    virtual void    DrawTexture(unsigned short int TextureNumber); 
      int     mActiveTexture; 

其中

void gTexture::DrawTexture() 
    { 
    gTexture::DrawTexture(mActiveTexture); 
    } 

我想有这样一个功能类似

virtual void    DrawTexture(unsigned short int TextureNumber=mActiveTexture); 

这没有编译,因为mActiveTexture是非静态数据成员的无效使用。有没有办法只有一个函数,这将使我更容易处理派生的对象?谢谢。

+1

什么是void foo():x(y){...}'? – juanchopanza

+0

@juanchopanza它是一个初始值设定项,只能在构造函数上完成 – wich

+0

@wich'DrawTexture'不是构造函数。 – juanchopanza

回答

1

我可以看到两种方式。两者都是解决方法 - 是的,但可能有用。

一个是使无参数函数非虚拟;它将总是用mActiveTexture来称呼第二个。

另一种方法是使用领域的知识(尤其是事实,0是不是一个有效的OpenGL纹理名称),这样做:

virtual void DrawTexture(unsigned short int TextureNumber = 0) { 
    if (TextureNumber == 0) TextureNumber = mActiveTexture; 
    // ... rest of the code 
} 
+1

我认为虚拟成员函数中的默认参数太可怕了。 – juanchopanza

+0

@juanchopanza事实上,至少可以说是有问题的,默认值是编译时间,使用的取决于指针/引用的类型而不是实际对象的类型。 – wich

+0

ohh很好的帮助,谢谢。但是,第二个地方临时工不起作用。 [0]指的是我的情况下纹理矢量的第一个元素。 – user2856452

0

你可以有一个默认的参数值无效(如-1)。然后你的函数可以检查该值是否为默认值,如果是,则使用mActiveTexture,否则将使用参数。

+0

这是一个好主意,但考虑到我使用数组和-1可能会导致程序崩溃。出于这个原因,我曾经在任何地方都拥有它,但是在我的整个项目中都偏离了-1 – user2856452

0

不,您不能将成员用作默认值。默认值在编译时使用。

然而,您可以使用特殊值作为默认值,如-1,然后检查DrawTexture,如果输入值为-1,并且如果将它设置为mActiveTexture。