c ++成员函数访问私有静态变量?

时间:2012-03-23 04:06:43

标签: c++ static-members

  

可能重复:
  What does it mean to have an undefined reference to a static member?

如果我在类声明之外实现函数,我不知道为什么我得到错误“未定义引用`TT :: i'”? 这是代码..

class TT{
private:
    static int i;
public:
    void t();
};

void TT::t(){
    i=0;
}

3 个答案:

答案 0 :(得分:19)

这与您定义函数的位置无关,而是您没有定义静态成员变量,您只声明了它。你需要把它的定义放在类之外,例如

int TT::i;

答案 1 :(得分:3)

  

未定义的引用`TT :: i'

是因为你没有在类外定义静态数据成员。在使用之前,必须在类外定义所有静态数据成员。

class TT
{
private:
    static int i;
public:
    void t();
};

void TT::t()
{
    i=0;
}
int TT::i=0; // define it outside the class. and if possible initialize 

答案 2 :(得分:2)

静态变量保存在内存的不同部分,而不是任何类的实例。这是因为它们不是任何类的实例的一部分。

下面的代码编译因为函数t从未被调用过。

class TT
{
private:
    static int i;
public:
    void t()
    {
        i=0;


    }
};

int main(int argc, char *argv[])
{
    qWarning() << "hi";
    TT * t = new TT();
    //t->t();
    return 0;
}

然而,这个代码不能编译,因为t被称为

class TT
{
private:
    static int i;
public:
    void t()
    {
        i=0;
    }
};

int main(int argc, char *argv[])
{
    qWarning() << "hi";
    TT * t = new TT();
    t->t();
    return 0;
}

您可以拥有未在C ++中使用的未定义引用(以及C)。出于某种原因,我不确定,编译器似乎认为这段代码引用了我,当符合上述内容的东西在被调用之前没有引用它(任何想法为什么)?

class TT
{
private:
    static int i;
public:
    void t();
};

//int TT::i = 0;

void TT::t(){
    i=0;
}

功能示例,静态定义:

class TT
{
private:
    static int i;
public:
    void t();
};

int TT::i = 0;

void TT::t(){
    i=0;
}