在构造函数中初始化的变量未保持初始化(c ++)

Leg*_*ade 0 c++ variables constructor visual-c++ c++11

我现在已经在C++工作了一段时间,但我以前从未遇到过这个错误.我有一个结构(名为skew_value),它有一个初始化方法,所以一切都可以有正确的默认值(如果它有一个以上的构造函数和析构函数,我使它成为一个类而不是一个结构).我已经验证了构造函数确实被调用(断点).并且正确设置变量.但是一旦构造函数完成,一切都是未初始化的.

代码如下:

#ifndef _LBMOON_GRAPHICSYSTEM_SKEW_VALUE_H
#define _LBMOON_GRAPHICSYSTEM_SKEW_VALUE_H

struct skew_value
{
    skew_value(float tlX=1, float tlY=0, float trX=0, float trY=0, float blX=0, float blY=0, float brX=0, float brY=0)
    {
        skew_value(Vector2f(tlX,tlY), Vector2f(trX,trY), Vector2f(blX,blY), Vector2f(brX,brY));
    }

    skew_value(Vector2f topLeft, Vector2f topRight, Vector2f bottomLeft, Vector2f bottomRight)
    {
        TLSkew = topLeft;
        TRSkew = topRight;
        BLSkew = bottomLeft;
        BRSkew = bottomRight;

        xScale = 1;
        yScale = 1;
    }

    float xScale;
    float yScale;

    Vector2f TLSkew;
    Vector2f TRSkew;
    Vector2f BLSkew;
    Vector2f BRSkew;

    Vector2f TLOrigin;
    Vector2f TROrigin;
    Vector2f BLOrigin;
    Vector2f BROrigin;

    unsigned int TLIndex;
    unsigned int TRIndex;
    unsigned int BLIndex;
    unsigned int BRIndex;
};



#endif
Run Code Online (Sandbox Code Playgroud)

Vector2f是一个包含两个float变量的类.缩放通常是其中之一,但我将其切换为两个浮点变量来测试问题不在于Vector2f类.

你可以给出关于为什么要调用构造函数的解释,但是所有被解除初始化的变量都会很棒.无论我是否将类作为指针,都会发生这种情况.我调用哪个构造函数或者提供参数也没关系.它只是在调用构造函数后拒绝跟踪数据.

UpA*_*dam 7

问题是您没有使用这些值返回正在初始化的对象.您对skew_value构造函数的调用采用float参数构造并初始化一个临时的匿名自动skew_value对象,但不会将其复制到您应该构建的对象中,也不会对其进行修改.因此,更改不会反映在最终返回的对象中.

C++不是Java或C#,您可以通过这种方式本地调用嵌套构造函数(来自函数体).

然而...

C++ 11引入了这种能力; 你只是没有使用正确的语法.应该像初始化列表参数一样调用它.

你应该说:

struct skew_value
{
    skew_value( float tlX=1, float tlY=0, float trX=0,
                float trY=0, float blX=0, float blY=0,
                float brX=0, float brY=0)
    : skew_value( Vector2f( tlX, tlY ), 
                  Vector2f( trX, trY ), 
                  Vector2f( blX, blY ), 
                  Vector2f( brX, brY ) )
    {
    }

    skew_value(Vector2f topLeft, Vector2f topRight, 
               Vector2f bottomLeft, Vector2f bottomRight)
    {
        TLSkew = topLeft;
        TRSkew = topRight;
        BLSkew = bottomLeft;
        BRSkew = bottomRight;

        xScale = 1;
        yScale = 1;
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

如果不能使用IF C++ 11功能
那么你必须要做很长时间,并建议使用初始化列表初始化所有值.

其他参考
在此相关问题中查找更多内容,这可能与以下内容重复:我可以在C++中从另一个构造函数(构造函数链接)调用构造函数吗?