C++ 成员函数静态变量与成员变量

C++ 成员函数静态变量与成员变量,c++,static,C++,Static,在成员函数中使用静态变量,而不是在函数调用之间保持其值的变量中使用成员变量,这是一种好的做法吗 考虑以下示例:我有一个类,它有一个update()函数,其中某个3D对象每一帧都在旋转。我有时会看到以下代码: void Class::update(float frameTime) { static float rotation = 0.0f; rotation + = m_rotationSpeed * frameTime if (rotation >= 360.0f

在成员函数中使用静态变量,而不是在函数调用之间保持其值的变量中使用成员变量,这是一种好的做法吗

考虑以下示例:我有一个类,它有一个
update()
函数,其中某个3D对象每一帧都在旋转。我有时会看到以下代码:

void Class::update(float frameTime)
{
    static float rotation = 0.0f;
    rotation + = m_rotationSpeed * frameTime
    if (rotation >= 360.0f) rotation -= 360.0f;
    // ...
}
这也可以使用成员变量来实现

是否有任何理由选择一种实现而不是另一种?在我看来,使用这样的静态方法确实可以提高封装性,还可以生成更小的对象,但另一方面,它似乎不那么直观


请注意,这样的类通常用于单个实例,而且,由于C++11,静态变量应该是线程安全的。

像这样使用静态变量对于一个小应用程序来说是可以的,但是随着应用程序越来越大,在您希望使用成员变量的地方使用静态变量就成了一个问题,因为它的可伸缩性超过了使用静态变量。

使用
静态变量没有什么意义这里,因为
的所有实例都将访问相同的变量。您不太可能需要在这样的实例之间共享
rotation


如果要将类限制为单个实例,则必须确保它只能实例化一次。但这通常是重新设计的一个标志。

我想说,如果使用单态方法,使用静态场是没有意义的。即使您的项目不会变得更大。

也不要使用静态模式。静态意味着您可以在不声明对象的情况下使用它。静电不适合你的情况。仅仅因为它只有一个并不意味着它需要是静态的

静态通常是有用的,当您有一些东西,您可能希望能够在没有两个对象实例的情况下进行比较

也就是说,您可能有一个形状对象,它有一个颜色枚举。通过使枚举为静态,您可以执行一些操作,例如
if(myShape.shapeColor==Shape::color::red)
但是,通常我远离静态。它是有用途的东西之一,不需要进一步扩展

编辑:


实际上,在这种情况下使枚举为静态不会改变任何东西。我想我会尽量保持我的答案在某种程度上是有效的,所以我会假装在这种情况下你不能使用枚举。(尽管这是一个C++问题,但我只是得到了一点。)你可以声明,比如说,一系列常量静态整数。您不会被迫使用两个对象进行比较

这里没有“好的实践”,因为他们不会做同样的事情:

  • 成员变量(属性)将仅由类的当前实例更新
  • 静态变量将由该类的所有实例修改
比如这个班

class Foo
{
 void bar() 
 {
  static int bar = 0;

  std::cout << bar << std::endl;
  bar++;
 }
};
将输出

1
2
3
4

你有没有想过,你可能想改变你的旋转,例如重置它?通常,旋转是任何渲染对象的公共属性,应该公开。因此,当且仅当存在单个实例时,如果该变量不是静态的,则大小要求有什么区别!???我在不止一个地方看到过类似的情况,这就是这个问题的原因。我不是在提倡这种方法,只是想找出为什么有人会这样编码@这个方法不是正在旋转的对象的成员,而是代表场景甚至主游戏循环的某个类,因此旋转将传递给对象,例如
object.setRotationY(rotation)
,但我明白你的意思。在这种情况下声明enum static实际上不会改变任何东西。@Marian噢,哇,你说得对,哈哈。对不起,我会进行编辑。这是否意味着大多数现代游戏引擎和渲染引擎需要重新设计?
1
2
3
4