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类.
你可以给出关于为什么要调用构造函数的解释,但是所有被解除初始化的变量都会很棒.无论我是否将类作为指针,都会发生这种情况.我调用哪个构造函数或者提供参数也没关系.它只是在调用构造函数后拒绝跟踪数据.
问题是您没有使用这些值返回正在初始化的对象.您对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++中从另一个构造函数(构造函数链接)调用构造函数吗?