C ++ struct初始化

时间:2012-12-19 11:03:49

标签: c++ data-structures struct

以下是我的Sprite类的删节版本:

class Sprite
{
    struct SpriteState {
        Vector3 position;
        int width, height;
        double rotation, scaling;
    };
    std::map<int, SpriteState> stateVector;
}

我想通过一个成员函数创建一个SpriteState对象,该成员函数看起来像下面一行:

SpriteState newSpriteState(
        Vector3 position = stateVector.rbegin()->second.position, 
        int width = = stateVector.rbegin()->second.width, 
        int height = = stateVector.rbegin()->second.height, 
        double rotation = stateVector.rbegin()->second.rotation, 
        double scaling = stateVector.rbegin()->second.scaling)
    { SpriteState a; a.position = position; a.width = width; a.height = height; a.rotation = rotation; a.scaling = scaling; return a; }

我收到以下错误:

  

非静态成员引用必须相对于特定对象

类本身背后的基本思想是存储精灵的各种状态,以便我可以在需要时轻松恢复到以前的状态。

但是,在大多数情况下,Sprite只会使用新的位置值进行更新,而宽度,高度,旋转和缩放几乎保持不变 - 这意味着我只会在弹出时更改位置值并再次保存最后一个参考值为其他值保存状态。

因此我希望能够为函数设置默认值,这样我就不必费力地重复写入相同的值。

有关实施的任何可能的想法吗?

4 个答案:

答案 0 :(得分:2)

超载它:

SpriteState newSpriteState(Vector3 position)
{
    return newSpriteState(
            position,
            stateVector.rbegin()->second.width, 
            stateVector.rbegin()->second.height, 
            stateVector.rbegin()->second.rotation, 
            stateVector.rbegin()->second.scaling)      
}

答案 1 :(得分:2)

默认参数在调用者的上下文中计算,因此如果您需要访问类的成员以获取“default”值,则不能使用默认参数。

另一方面,您可以使用重载来获得相同的效果:

SpriteState newSpriteState(
    Vector3 position,
    int width,
    int height,
    double rotation,
    double scaling)
{ 
    SpriteState a; 
    a.position = position; 
    a.width = width; 
    a.height = height; 
    a.rotation = rotation; 
    a.scaling = scaling; 
    return a; 
}

SpriteState newSpriteState(
    Vector3 position)
{
    return newSpriteState(position,
                          stateVector.rbegin()->second.width, 
                          stateVector.rbegin()->second.height, 
                          stateVector.rbegin()->second.rotation, 
                          stateVector.rbegin()->second.scaling);
}
/* ... And similar for additional non-default values. */

答案 2 :(得分:1)

您应该复制SpriteState,然后修改它:

SpriteState newSpriteState(stateVector.rbegin()->second);
newSpriteState.width = someNewWidth;
return newSpriteState;

默认情况下,每个结构和类都具有以下形式的复制构造函数:

ClassName(const ClassName&);

默认情况下,它会复制类/结构中的数据。

答案 3 :(得分:1)

会员功能无法调用班级成员。您可以通过执行以下操作将其归档:

SpriteState newSpriteState(SpriteState sprite_state)        
{ 
  SpriteState a; 
  a.position = position; 
  a.width = width; 
  a.height = height; 
  a.rotation = rotation; 
  a.scaling = scaling; 
  return a; 
}

然后在另一个member function中调用此函数:

newSpriteState(stateVector.rbegin()->second);