2013-02-02 158 views
1

这似乎是不好的编码习惯,但这是给我的指导方针。我想说,我不知道这将如何实际上在主要实施,我只是写课程。C++ - 初始化成员函数内的成员变量?

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

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

总会(我猜)被用来计算该类的对象数。 这基本上是我所掌握的。问题是我如何弄清如何实际调用函数。 我不能只是在构造函数中调用它,感觉每次都会重置总数。 我试过了,如果变量有值,检查失败,如果没有,请调用函数。

有没有什么建议谁能给?

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

+0

希望这有助于:http://msdn.microsoft.com/en-us/library/b1b5y48f(v=vs.80).aspx – chris

回答

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; 
+1

的名称也应该改变,它不会初始化任何东西。 –

+0

现在,您在'initalizeTotal()'的定义中缺少返回类型。由于它不触及任何实例的状态,它也应该是'static'。你最好把它变成私人的,否则每个人和任何人都可能会混淆似乎是内部状态的东西。 – Flexo

+1

此外,我意识到这是超越了问题的范围,如果曾经被多个线程同时创建这些对象,这将打破。 –

5

由于total应为每个对象相同的变量,你应该让static

class Example { 
    private: 
     static int total; 
} 

要初始化静态变量,你可以把这个线在一个.cpp文件:

int Example::total = 0; 

你并不需要调用任何功能,这样做初始化。

+0

我知道这一点。这通常是我如何初始化变量。然而,这是一个我必须使用一个函数的任务。吮吸我知道-_- – user2036101

+0

它必须是一个成员函数吗?你允许声明该函数是静态的吗? –

2

您必须使用'total'字段作为static变量才能与所有类型为Example的对象共享。任何时候立即增加一个新的对象将增加total字段。 希望这有助于

1

尝试以下操作:

#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 
} 
+0

为什么getTotal()不是'static'? – Flexo

+0

@Flexo它应该是?为什么? – 0x499602D2

+1

它应该是因为它不访问非静态状态并且不需要这样的访问,因为非变异成员应该是'const'。尽管如此,你仍然可以调用'a.getTotal()'(http://stackoverflow.com/a/325572/168175),就像在非const的实例上调用const成员一样。 – Flexo