在创建对象之前,我需要将static int number设置为零(0)。
在main.cpp中,调用函数A::resetNumber()
在a.h中有私有:(static int number
)
内联函数:static void resetNumber() { number = 0; }
但结果:
/tmp/ccXtEOHO.o: In function `Treadmill::resetNumOfTreadmills()':
main.cpp:(.text._ZN9Treadmill20resetNumOfTreadmillsEv[_ZN9Treadmill20resetNumOfTreadmillsEv]+0x6): undefined reference to `Treadmill::numOfTreadmills'
/tmp/ccFNFppU.o: In function `Treadmill::Treadmill()':
treadmill.cpp:(.text+0x231): undefined reference to `Treadmill::numOfTreadmills'
treadmill.cpp:(.text+0x240): undefined reference to `Treadmill::numOfTreadmills'
treadmill.cpp:(.text+0x249): undefined reference to `Treadmill::numOfTreadmills'
collect2: error: ld returned 1 exit status
答案 0 :(得分:0)
您需要在源文件中定义静态变量。例如:
在标题中:
#pragma once
static int number; // only a declaration!
void resetNumber() { number = 0; }
来源:
int number = 0; // definition!
另一种方法:
有时这也可能是一个选择:
inline int& AccessStaticNumber() {
static int number = 0;
return number;
}
此方法仅需要标题。您可以使用它,例如:
AccessStaticNumber() = 0;
int q = 3*AccessStaticNumber();
答案 1 :(得分:0)
你可以做得更简单
头文件中的
class A
{
public:
static int a;
static void setA(int a);
static void resetA();
};
在cpp文件中
int A::a=0;
void A::setA(int a)
{
this->a=a;
}
void A::resetA()
{
a=0;
}
要使用此变量,您只需使用A::a;
这种初始化发生在主要发生之前
您还可以更改通过
的值A::resetA();
答案 2 :(得分:0)
标头只定义类的定义,您仍然需要为成员分配一些存储空间。
通常,对于非静态成员,对new(或堆栈上的alloc)的调用将创建此存储。由于静态对所有实例都是“全局的”,因此您无法以这种方式分配它们,因此您必须手动定义某个存储 - 在某个源文件中。