0

我正在努力理解术语静态手段及其工作原理。在这里,我初始化了一个静态变量“浮动百分比”。我必须使用 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

感谢给予的帮助。谢谢

4

5 回答 5

4

static在这种情况下,意味着该变量percentage不属于 Foo 类的特定实例,而是在 Foo 的所有实例之间共享。

为了让链接器知道你需要定义它的变量,而不仅仅是声明它,这就是你得到错误的原因。

float Foo::percentage = 0;

在您的 .cpp 文件中

于 2013-10-09T09:19:03.693 回答
2

静态成员在该类的所有对象之间共享。

静态数据成员在类声明中声明,并在包含类方法的文件中初始化。作用域运算符在初始化中用于指示静态成员属于哪个类。但是,如果静态成员是 const 整数类型或枚举类型,则可以在类声明本身中对其进行初始化。

class Foo     {
private:
    static float percentage; // this is declaration not definition

public :    
    float convertToPercent();

};

您需要percentage在 cpp 文件中定义:

float Foo::percentage(0.0);  // initialize percentage to 0.0    

§ 9.4.2静态数据成员

静态数据成员在其类定义中的声明不是定义,并且可能是除 cv 限定的 void 之外的不完整类型。

于 2013-10-09T09:13:00.677 回答
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 中的百分比值。

于 2013-10-09T09:18:15.190 回答
1

您只在类中声明了它,但没有在 cpp 中给出应该如下所示的定义:

float Foo::percentage;
于 2013-10-09T09:13:04.920 回答
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++ 要求您为使用的任何内容提供定义,但特定于类的静态和整型常量是一个例外。只要你不取他们的地址,你就可以在不提供定义的情况下声明和使用它们。

在您的情况下,您的实现文件 (.cpp) 应该具有以下行,然后您可以在适用的情况下使用“百分比”常量。

float Foo::percentage(0.0);     //definition of static class member : percentage
于 2013-10-09T09:45:19.260 回答