可能重复:
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;
}
答案 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;
}