【问题标题】:What is this C++ Function Declaration这是什么 C++ 函数声明
【发布时间】:2015-12-03 03:09:32
【问题描述】:

我是 C++ 新手,我在文档上工作的内容告诉我看示例代码,但它没有解释任何内容,所以我试图破译它。

我遇到了这个函数声明,但我不完全理解它。

只是第一个函数

我在 MHWRender::MPxShaderOverride(obj) 之后得到了我没有得到的部分,然后它作为参数列表开始(或者我不知道它叫什么)

我猜我会在哪里找到指定的输入。

再次,我不知道这是在做什么,所以我有点迷失了如何解释它。

完整的代码可以在这里找到: http://help.autodesk.com/view/MAYAUL/2016/ENU/?guid=__cpp_ref_hw_phong_shader_2hw_phong_shader_8cpp_example_html

    hwPhongShaderOverride(const MObject& obj)
: MHWRender::MPxShaderOverride(obj)
, fShaderNode(NULL)
, fTextureData(NULL)
, fDrawUsingShader(true) // Disabling this will use fixed-function which only has an OpenGL implementation
, fShaderBound(false)
, fTexture(NULL)
, fInColorPass(false)
, fColorShaderInstance(NULL)
, fInShadowPass(false)
, fShadowShaderInstance(NULL)
, fTransparency(0.0f)
{
    // Create a shader instance to use for drawing
    //
    if (fDrawUsingShader)
    {
        createShaderInstance();
    }
    fAmbient[0] = fAmbient[1] = fAmbient[2] = 0.0f;
    fDiffuse[0] = fDiffuse[1] = fDiffuse[2] = fDiffuse[3] = 0.0f;
    fSpecular[0] = fSpecular[1] = fSpecular[2] = 0.0f;
    fShininess[0] = fShininess[1] = fShininess[2] = 500.0f;
}

// override blend state when there is blending
static const MHWRender::MBlendState *sBlendState;

// Current hwPhongShader node associated with the shader override.
// Updated during doDG() time.
hwPhongShader *fShaderNode;
// Shader inputs values including transparency
float fTransparency;
float fAmbient[3];
float fDiffuse[4];
float fSpecular[3];
float fShininess[3];

// Temporary system buffer for creating textures
unsigned char* fTextureData;

// Pass tracking
bool fInColorPass;
bool fInShadowPass;

// Draw with texture or shader flag
bool fDrawUsingShader;
// VP2 texture
MHWRender::MTexture *fTexture;
// VP2 color shader
MHWRender::MShaderInstance *fColorShaderInstance;
// VP2 shadow shader
MHWRender::MShaderInstance *fShadowShaderInstance;
mutable bool fShaderBound;

【问题讨论】:

    标签: c++ maya-api


    【解决方案1】:

    这是一个类构造函数。该类名为hwPhongShaderOverrideMObject,它派生自MHWRender::MPxShaderOverride,例如:

    class hwPhongShaderOverrideMObject : public MHWRender::MPxShaderOverride
    {
        ...
    };
    

    hwPhongShaderOverride(const MObject& obj) 指定此构造函数将一个参数作为输入,即对 MObject 实例的 const 引用。构造函数是在类声明本身内内联声明和实现的,而不是与其声明分开实现。这两种方法在 C++ 中都是允许的。

    :{ 之间的所有内容都是构造函数的初始化列表。它初始化类的成员。

    : 开始初始化列表。

    MHWRender::MPxShaderOverride(obj) 将输入对象传递给基类构造函数。必须始终首先构造基类。

    , fShaderNode(NULL) 正在将 fShaderNode 成员初始化为 NULL。

    , fTextureData(NULL) 正在将 fTextureData 成员初始化为 NULL。

    以此类推,直到到达{ 以结束初始化列表。然后像任何其他函数一样,在首先初始化类成员之后,进入构造函数的body

    【讨论】:

    • 那么我的下一个问题是为什么不在构造函数内部这样做。(我来自 Python 和 JavaScript 的背景,所以对我来说这更有意义)
    • 在构造函数的初始化列表中初始化类成员比在构造函数的主体中更有效。对于 POD 类型(整数、布尔值、指针等)来说没什么大不了的,但对于其他类型来说可能是个大问题。初始化列表允许将数据传递给类成员构造函数。如果您在构造函数主体中进行初始化,则编译器必须首先默认构造成员,然后再执行分配。如果可用,最好通过自己的构造函数初始化成员。
    【解决方案2】:

    下面是一个构造函数。

    hwPhongShaderOverride(const MObject& obj)
    : MHWRender::MPxShaderOverride(obj)
    , fShaderNode(NULL)
    , fTextureData(NULL)
    , fDrawUsingShader(true) // Disabling this will use fixed-function which only has an OpenGL implementation
    , fShaderBound(false)
    , fTexture(NULL)
    , fInColorPass(false)
    , fColorShaderInstance(NULL)
    , fInShadowPass(false)
    , fShadowShaderInstance(NULL)
    , fTransparency(0.0f)
    {
        // Create a shader instance to use for drawing
        //
        if (fDrawUsingShader)
        {
            createShaderInstance();
        }
        fAmbient[0] = fAmbient[1] = fAmbient[2] = 0.0f;
        fDiffuse[0] = fDiffuse[1] = fDiffuse[2] = fDiffuse[3] = 0.0f;
        fSpecular[0] = fSpecular[1] = fSpecular[2] = 0.0f;
        fShininess[0] = fShininess[1] = fShininess[2] = 500.0f;
    }
    

    它使用initializer list 通过调用其构造函数来初始化其成员变量。 hwPhongShaderOverride 继承自 MHWRender::MPxShaderOverride,因此它调用 MHWRender::MPxShaderOverride 的构造函数作为初始化列表中的第一个元素(即 MHWRender::MPxShaderOverride(obj)

    您可以切换fDrawUsingShader 来创建着色器的实例(如构造函数的主体中所示)。之后,它将一些初始值添加到四个数组fAmbientfDiffusefSpecularfShininess

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2017-03-08
      • 2010-12-30
      相关资源
      最近更新 更多