我正在努力理解静态手段及其工作原理。这里我初始化了一个静态变量“float percentage”。我必须使用convertToPercent()将其转换为百分比,并在转换后我必须取值并将值放到someMethod()进行一些计算
以下是我所拥有的
·H
class Foo {
private:
static float percentage;
public :
float convertToPercent();
};
的.cpp
float Foo::convertToPercent() {
percentage = (30/100) * 100;
return percentage;
}
static float someMethod () {
//place the static percentage value here after doing convertToPercent() method to do some calculation;
}
然而它会抛出一条错误消息
Undefined symbols for architecture x86_64:
"Foo::percentage", referenced from:
Foo::convertToPercent() in Foo.o
给予帮助的Apperciate。感谢
答案 0 :(得分:4)
static
表示变量percentage
不属于类Foo的特定实例,而是在Foo的所有实例之间共享。
为了让链接器知道你需要定义它的变量而不只是声明它就是你得到错误的原因。
把
float Foo::percentage = 0;
你的.cpp文件中的
答案 1 :(得分:2)
静态成员在该类的所有对象之间共享。
静态数据成员在类声明中声明,并在包含类方法的文件中初始化。范围运算符用于初始化以指示静态成员属于哪个类。但是,如果静态成员是const整数类型或枚举类型,则可以在类声明本身中初始化它。
class Foo {
private:
static float percentage; // this is declaration not definition
public :
float convertToPercent();
};
您需要在cpp文件中定义percentage
:
float Foo::percentage(0.0); // initialize percentage to 0.0
§9.4.2静态数据成员
静态数据成员在其类定义中的声明不是定义,并且可能是除了cv-qualified void之外的不完整类型。
答案 2 :(得分:2)
您必须在类之外定义静态变量。
// header file
class Foo {
private:
static float percentage;
};
// cpp file
float Foo::percentage(0.0);
因为成员变量是静态的,所以在整个流程运行时期间,Foo类(所有Foo对象)的所有实例之间只共享一个此变量的值。例如。如果您有三个Foo对象A,B和C,那么更改对象B中的百分比值也会在对象A和C中更改它。
答案 3 :(得分:1)
你只在类中声明它,但没有在cpp中给出一个看起来像这样的定义:
float Foo::percentage;
答案 4 :(得分:0)
在您的代码下面尝试声明一个静态成员变量百分比--- OKAY
// header file
class Foo
{
private:
static float percentage; //constant declaration
};
在您的代码下面尝试为尚未定义的对象(百分比)分配值。 - 不是好的
// cpp file
float Foo::convertToPercent() {
percentage = (30/100) * 100; //tring to update percentage which is not defined yet.
return percentage; //usage of object (percentage) which is not defined yet.
}
C ++要求您为所使用的任何内容提供定义,但是staic和整数类型的特定于类的常量是一个例外。只要您不接受他们的地址,您就可以声明它们并在不提供定义的情况下使用它们。
在您的情况下,您的实施文件(.cpp)应该具有以下行,然后您可以在适用的地方使用“百分比”常量。
float Foo::percentage(0.0); //definition of static class member : percentage