无法使用访问者设置私有静态成员变量

时间:2014-03-05 03:06:53

标签: c++ static private member

Zombie.h有一些静态成员变量。 Read.cpp,包括Zombie.h,知道这些变量需要的值。我想read.cpp用

的行设置这些变量
int Zombie::myStaticInt = 4;

Zombie::setStaticVar(4);

我已经尝试了所有我能想到的东西,包括使用公共静态访问器函数甚至将静态变量本身公开,但是我得到了很多“未定义的引用”或“无效使用限定名称” “错误。通过查看那些我发现如何从Zombie.cpp设置Zombie.h的私有静态成员变量,但我没有Zombie.cpp文件,只有read.cpp。我可以从Read.cpp中设置它们,如果是,那怎么办?

// In Zombie.h
class Zombie {
public:
    static void setMax(int a_in, int b_in, int c_in) {
        a = a_in;
        b = b_in;
        c = c_in;
    }
private:
    static int a, b, c;
}

// In read.cpp
#include "Zombie.h"
...
main() {
    int Zombie::a; // SOLUTION: Put this outside the scope of main and other functions
    int Zombie::b; // SOLUTION: Put this outside the scope of main and other functions
    int Zombie::c; // SOLUTION: Put this outside the scope of main and other functions
    int first = rand() * 10 // Just an example
    int second = rand() * 10 // Just an example
    int third = rand() * 10 // Just an example
    Zombie::setMax(first, second, third);
    return 0;
}

这产生(更新) (在main()之外移动前三行main来解决这个问题)

invalid use of qualified-name 'Zombie::a'
invalid use of qualified-name 'Zombie::b'
invalid use of qualified-name 'Zombie::c'

3 个答案:

答案 0 :(得分:2)

你必须在某处定义 a,b,c。到目前为止,您只有声明它们才能存在。在某些.cpp文件中,在外部作用域中,您需要添加:

int Zombie::a;
int Zombie::b;
int Zombie::c;

编辑重新编辑,不能将它们放在方法中。您必须将它放在.cpp文件的最外层。

答案 1 :(得分:1)

与在每个对象中分配存储的非静态变量不同,静态变量必须将其存储在类之外。您可以通过在.cpp文件中创建变量的定义来完成此操作。它们进入哪个文件并不重要,尽管为方便起见,它们应该使用该类的代码。

int Zombie::a;
int Zombie::b;
int Zombie::c;

您收到的链接器错误告诉您缺少这些行。

答案 2 :(得分:0)

你的问题是你还没有实现Zombie类。 你的代码在这里:

zombie.h

#ifndef ZBE_H
#define ZBE_H

class Zombie
{
public:
    static int myStaticInt;

    Zombie();
};
#endif

read.cpp

#include <stdio.h>
#include <iostream>
#include "zombie.h"

int Zombie::myStaticInt = 1;

Zombie::Zombie()
{
}

int main()
{ 
    cout << "OOOK: " << Zombie::myStaticInt << endl;

    Zombie::myStaticInt = 100;

    cout << "OOOK: " << Zombie::myStaticInt << endl;

    return 0;
}