静态数据成员

时间:2012-12-04 14:01:33

标签: c++ visual-studio-2010

请查看以下代码

GameObject.h

#pragma once
class GameObject
{
public: 
    GameObject(int);
    ~GameObject(void);


    int id;

private:
    GameObject(void);


};

GameObject.cpp

#include "GameObject.h"
#include <iostream>

using namespace std;

static int counter = 0;


GameObject::GameObject(void)
{
}

GameObject::GameObject(int i)
{
    counter++;
    id = i;
}


GameObject::~GameObject(void)
{
}

Main.cpp的

#include <iostream>
#include "GameObject.h"

using namespace std;

int main()
{
    //GameObject obj1;
    //cout << obj1.id << endl;

    GameObject obj2(45);
    cout << obj2.id << endl;;
//  cout << obj2.counter << endl;

    GameObject obj3(45);
    GameObject obj4(45);
    GameObject obj5(45);


    //Cannot get Static value here
    //cout << "Number of Objects: " << GameObject
    //

    system("pause");
    return 0;
}

在这里,我试图记录已创建的实例数。我知道它可以由静态数据成员完成,但我无法使用Main方法访问它!请帮忙!

PS:

我正在寻找直接访问,没有getter方法

3 个答案:

答案 0 :(得分:2)

您的静态变量counter无法访问,因为它不是GameObject的成员。如果您想访问counter,则需要执行以下操作:

<强> GameObject.h

#pragma once

class GameObject
{
public: 
    ...
    static int GetCounter();
    ...
};

<强> GameObject.cpp

int GameObject::GetCounter()
{
    return counter;
}

然后您可以访问变量,如:

cout << "Number of Objects: " << GameObject::GetCounter();

当然,还有其他方法可以访问静态变量,例如使counter变量成为GameObject类的静态成员(我建议)。

答案 1 :(得分:0)

在您的代码中,counter不是您班级的静态成员,而只是一个好的旧全局变量。您可以阅读如何在网络上的任何位置声明静态成员变量,但这里有一些片段:

<强> GameObject.h

#pragma once
class GameObject
{
public: 
    GameObject(void);
    GameObject(int);
    ~GameObject(void);

private:
    int id;

// static members
public: 
    static int counter; // <<<<<<<<<<< declaration
};

<强> ameObject.cpp

#include "GameObject.h"

int GameObject::counter = 0; // <<<<<<<<<<< instantiation


GameObject::GameObject(void)
{
    counter++;
}

GameObject::GameObject(int i)
{
    counter++;
    id = i;
}


GameObject::~GameObject(void)
{
}

<强> Main.cpp的

#include <iostream>
#include "GameObject.h"

using namespace std;

int main()
{
    GameObject obj2(45);
    cout << "version one: " << obj2.counter << endl;

    // second version:
    cout << "version two: " << GameObject::counter << endl;

    system("pause");
    return 0;
}

Afaik访问该类实例上的静态成员应该可以正常工作,但它会给人一种错误的印象,你应该更喜欢第二版。

答案 2 :(得分:-1)

没关系,我用一个getter方法做到了。关闭线程