【问题标题】:C++ - Initializing a Member variable inside a member function?C++ - 在成员函数中初始化成员变量?
【发布时间】:2013-02-02 22:10:53
【问题描述】:

这似乎是一种不好的编码习惯,但这是给我的指导方针。我想先说我不知道​​这将如何在主体中实际实现,我只是在编写类。

class Example
{
  private:
     static int total;
  public:
    void initalizeTotal();
}

Example::initalizeTotal()
{
   total = 0;
}

total 将(我猜)用于计算该类的对象数。 这基本上就是我的意思。问题是我如何弄清楚如何实际调用该函数。 我不能只在构造函数中调用它,感觉每次都会重置总数。 我已经尝试过“检查”变量是否有值但失败了,如果没有,则调用该函数。

有没有人可以给点建议?

编辑: 我忘了包括那个总数是静态的。而且我必须有一个初始化总计的函数。这是作业的要求。

【问题讨论】:

标签: c++


【解决方案1】:

因为total 应该是每个对象的同一个变量,所以你应该把它改成static

class Example {
    private:
        static int total;
}

要初始化静态变量,您可以将此行放在 .cpp 文件中:

int Example::total = 0;

您不需要调用任何函数来执行此初始化。

【讨论】:

  • 我知道这一点。这通常是我初始化变量的方式。然而,这是我必须使用函数的任务。糟透了我知道-_-
  • 必须是成员函数吗?是否允许将函数声明为静态?
【解决方案2】:

您可以将total 变量设为静态:

class Example
{
  private:
     void addObject();
  public:
     static int total;
     Example();
}

Example::Example()
{
   addObject();
}

void Example::addObject()
{
   total++;
}

这样它就不会属于任何特定的对象。如果您随后在构造函数中调用的addObject() 方法中增加它的值,您将获得对象计数。

要访问它,您不会使用任何 Example 对象,而是可以像这样使用它:

std::cout << "Objects count:" << Example::total;

如果你想初始化它,你可以在代码中的某个地方做同样的事情:

Example::total = 0;

【讨论】:

  • 名称也应该改变,它没有初始化任何东西。
  • 您现在在 initalizeTotal() 的定义中缺少返回类型。因为它不涉及任何实例的状态,所以它也应该是static。你最好也将其设为私有,否则每个人和任何人都可以搞乱似乎是内部状态的东西。
  • 另外,我意识到这超出了问题的范围,如果这些对象是由多个线程同时创建的,这将会中断。
【解决方案3】:

您必须使用'total' 字段作为static 变量,以便与所有创建的Example 类型的对象共享。并且任何时候实例化一个新对象都会增加total 字段。 希望对您有所帮助

【讨论】:

    【解决方案4】:

    尝试以下方法:

    #include <iostream>
    
    class Example {
       static int total;
    
       public:
         Example() { total++; }
         static int getTotal() { return total; }
    };
    
    int Example::total = 0;
    
    int main() {
        Example a, b, c, d;
    
        std::cout << Example::getTotal(); // 4
    }
    

    【讨论】:

    • 为什么getTotal() 不是static
    • 应该是因为它不访问非静态状态,也不需要这种访问,同理非变异成员应该是const。不过,您 can still call a.getTotal() even if it's static,就像在非常量实例上调用 const 成员一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多