storing return values then using vs using directly c++
Hey guys, I was writing some code and I found a peculiar error. The function convert_vector2d(&i_scale) converts a string to a vector2d (inherits from sf::vector2f). If you examine the next few lines of code, I am doing the same operation twice.
Code: Select all
float x = convert_Vector2D(&i_scale).x;
float y = convert_Vector2D(&i_scale).y;
object.SetScale( ( convert_Vector2D(&i_scale) ) );
ss = object.GetScale();
object.SetScale( x , y );
ss = object.GetScale();
First time I call setScale with the return vector from convert_vector2d and ss = 1,1. I then call object.setScale again this time with x, y (the stored results) and when I call object.getScale I get ss = 1,2 (which is expected/correct).
I stepped through the convert function and it returns 1,2 through both function calls.
Code: Select all
const Vector2D Map::con开发者_开发百科vert_Vector2D(std::string * string_to_convert)
{
size_t foundit = 0;
Vector2D temp;
std::string one, two;
if( (foundit = string_to_convert->find(',')) != std::string::npos &&
string_to_convert->find_first_of(',') == string_to_convert->find_last_of(',') ) // only one comma per line.
{
one = string_to_convert->substr(0, foundit);
two = string_to_convert->substr(foundit+1, string_to_convert->size()); // +1 to skip over the comma.
temp.x = (float)strtod( one.c_str(), NULL );
temp.y = (float)strtod( two.c_str(), NULL );
check_conversion_errors_vector2d(temp, string_to_convert);
}
else
{
Debugger::print("MapLoader: Error: more then one comma on line %d of file %s. Stopping reading of file.\n",
i_Current_Line, mMapName.c_str() );
i_QuitParsing = true; // TODO: maybe add return after this line?
}
return temp;
}
Any ideas on why I'm getting different behavior?
void Drawable::SetScale(float ScaleX, float ScaleY)
{
SetScaleX(ScaleX);
SetScaleY(ScaleY);
}
void Drawable::SetScale(const Vector2f& Scale)
{
SetScaleX(Scale.x);
SetScaleY(Scale.y);
}
void Drawable::SetScaleX(float FactorX)
{
if (FactorX > 0)
{
myScale.x = FactorX;
myNeedUpdate = true;
myInvNeedUpdate = true;
}
}
void Drawable::SetScaleY(float FactorY)
{
if (FactorY > 0)
{
myScale.y = FactorY;
myNeedUpdate = true;
myInvNeedUpdate = true;
}
}
SFML copy constructors and member variables:
// = equals operator assignment
Vector2D& operator=(const Vector2D &rhs)
{
if(this == &rhs)
{
return *this;
}
else
{
this->x = rhs.x;
this->y = rhs.y;
return *this;
}
}
// = equals operator assignment
Vector2D& operator=(const sf::Vector2f &rhs)
{
this->x = rhs.x;
this->y = rhs.y;
return *this;
}
float x, y;
Don't allocate Vector2D on the stack, do it on the heap with new. Your reference to temp outside of the function is undefined, likely to be garbage.
精彩评论