【问题标题】:Increment non-static variable via static function通过静态函数增加非静态变量
【发布时间】:2016-04-14 01:01:06
【问题描述】:

我正在用 C++ 创建一个生态系统,其中 每个 ANIMAL 在我的playing_field 上将在今年年底grow_older()

class ANIMAL
{
private:
    int age;

public:   

    ANIMAL()
    {
     age=0;
    }

    static void grow_older(){ age++; }
};

我知道static methods can only use static data,但是有没有什么优雅的方式可以拥有类似于ANIMAL.grow_older(); 的东西?我可以遍历我的playing_field 并在每只动物上调用grow_older();,但我希望有一些我不知道的概念可以避免明确地遍历ANIMAL 的每个实例。

【问题讨论】:

  • 在此处询问有关 C++ 的问题时,应将 C++ 作为标记。
  • 如果每只动物都需要自己的age 实例,您可以改为存储一个固定数据成员time_of_birth 并增加一个静态current_time...然后仅在需要时计算差异。当ANIMAL“出生”(构造?)时,您将分配time_of_birth = current_time;
  • 但是……这个请求对我来说没有多大意义。动物不是动物的集合。
  • playing_field 是一个二维的动物数组
  • @mah 您能否在下面发布您的解决方案作为答案?我不明白

标签: c++ oop static increment


【解决方案1】:

没有一种优雅的方法可以一次从多个对象中创建数据成员的值,因此您的选择似乎是要么有一个静态 age(我认为这对您的用例无效),以增加所有对象的age 一次一个(通过迭代它们所在的任何容器来找到每个对象),或完全采用不同的解决方案。

一种可能的替代解决方案是根本不将age 存储为数据成员,而是将time_of_birth 存储为数据成员,并将current_time 作为静态数据成员进行跟踪。您的课程将如下所示:

class ANIMAL
{
private:
    int time_of_birth;
    static int current_time;

public:   

    ANIMAL()
    {
     time_of_birth=current_time;
    }

    static void grow_older(){ current_time++; }

    int age() { return current_time - time_of_birth; }
};
int ANIMAL::current_time = 0; /* defined in a source, not header file */

如果每次您必须增加年龄,您还需要检查年龄(例如,查看动物现在是否必须死亡),可能没有节省,因为您无论如何都需要遍历您的动物园。另一方面,如果您不需要像需要增加年龄一样(或更多)检查年龄,那么这种方法应该会执行得更好,因为它会减少工作量。

【讨论】:

  • 这清除了一切。尽管我所要求的似乎是 hack-ish,但您所做的事情是有道理的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多