C++ 通过类成员函数访问静态常量变量时出现问题

C++ 通过类成员函数访问静态常量变量时出现问题,c++,C++,访问类私有成员变量部分中定义的静态常量变量时遇到问题。具体地说,下面编写的代码可以在构造函数中输出变量,但是当我试图通过访问器函数访问它时,会遇到下面讨论的错误。如果有人知道为什么我会感谢你的帮助 #include <iostream> using namespace std; class TestStaticVariables { // Private member variable: static const double static_double_variable; p

访问类私有成员变量部分中定义的静态常量变量时遇到问题。具体地说,下面编写的代码可以在构造函数中输出变量,但是当我试图通过访问器函数访问它时,会遇到下面讨论的错误。如果有人知道为什么我会感谢你的帮助

#include <iostream>
using namespace std;

class TestStaticVariables
{
 // Private member variable:
 static const double static_double_variable;
public:
 // Constructor:
 TestStaticVariables()
 {
  // Initialization:
  static const double static_double_variable = 20.0;
  cout << static_double_variable;
 }
 // Member Function:
 void test();
};

void TestStaticVariables::test()
{
#包括
使用名称空间std;
类TestStaticVariables
{
//私有成员变量:
静态常数双静态变量;
公众:
//建造商:
TestStaticVariables()
{
//初始化:
静态常数双静态变量=20.0;

cout尝试在类定义之外初始化变量,下面是一个工作示例:

#include <iostream>

class Foo {
    static const double _bar;

public:
    Foo();

    void Bar();
};

const double Foo::_bar = 20.0;

Foo::Foo() {
    std::cout << Foo::_bar << std::endl;
}

void Foo::Bar() {
    std::cout << Foo::_bar << std::endl;
}

int main( int argc, char *argv[] ) {
    Foo f;
    f.Bar();

    return 0;
}
#包括
福班{
静态常数双_条;
公众:
Foo();
空心钢筋();
};
常数双Foo::_bar=20.0;
Foo::Foo(){

std::cout尝试在类定义之外初始化变量,下面是一个工作示例:

#include <iostream>

class Foo {
    static const double _bar;

public:
    Foo();

    void Bar();
};

const double Foo::_bar = 20.0;

Foo::Foo() {
    std::cout << Foo::_bar << std::endl;
}

void Foo::Bar() {
    std::cout << Foo::_bar << std::endl;
}

int main( int argc, char *argv[] ) {
    Foo f;
    f.Bar();

    return 0;
}
#包括
福班{
静态常数双_条;
公众:
Foo();
空心钢筋();
};
常数双Foo::_bar=20.0;
Foo::Foo(){
std::cout您标记为“//Initialization”的实际上是在不同的范围内创建并初始化具有相同名称的第二个变量。在构造函数内创建的静态双变量是构造函数中的局部变量,而不是指具有相同名称的类级静态变量

要避免这种情况,您需要做的是简单地删除类型信息,使其成为普通语句,而不是初始化,如下所示:

   // Initialization:
   static_double_variable = 20.0;
但这当然不会真正起作用,因为这是一个常量变量的赋值,你还有第二个问题,我认为这是你看到的错误的真正原因。当你写:

  // Private member variable:
 static const double static_double_variable;
您正在声明这样一个变量将存在。但是您实际上并没有定义该变量(即指示编译器为其创建存储)

为了做到这一点,并在
类{}
构造之外解决这两个问题,您需要编写:

 const double  TestStaticVariables::static_double_variable = 20.0;
这既定义了变量,又给它一个初始的常量值

在不清楚的情况下,这个问题也在C++ FAQ中简洁地描述:

您标记为“//Initialization”的内容实际上是在不同的范围内创建并初始化具有相同名称的第二个变量。在构造函数内创建的静态变量是构造函数中的局部变量,而不是指具有相同名称的类级静态变量

要避免这种情况,您需要做的是简单地删除类型信息,使其成为普通语句,而不是初始化,如下所示:

   // Initialization:
   static_double_variable = 20.0;
但这当然不会真正起作用,因为这是一个常量变量的赋值,你还有第二个问题,我认为这是你看到的错误的真正原因。当你写:

  // Private member variable:
 static const double static_double_variable;
您正在声明这样一个变量将存在。但是您实际上并没有定义该变量(即指示编译器为其创建存储)

为了做到这一点,并在
类{}
构造之外解决这两个问题,您需要编写:

 const double  TestStaticVariables::static_double_variable = 20.0;
这既定义了变量,又给它一个初始的常量值

在不清楚的情况下,这个问题也在C++ FAQ中简洁地描述:


您在构造函数中所做的是隐藏成员变量。

必须在类声明之外初始化
静态\u double\u变量。

在构造函数中执行的操作是隐藏成员变量。

必须在类声明之外初始化
静态\u double\u变量。

构造函数声明并定义一个局部静态变量,该变量恰好与类静态成员变量同名。局部变量隐藏类成员

这是您在构造函数中看到的。然后,当您尝试链接另一个方法中的类成员时,链接器发现它已声明但未定义,因此放弃


您可能无论如何都不应该初始化构造函数中的静态类成员,因为该类只有一个变量,但每个实例都会调用一次构造函数。您应该在任何函数外部(或仅在声明中)定义该变量,除非您想对API的用户隐藏该值.

构造函数声明并定义一个局部静态变量,该变量恰好与类静态成员变量同名。局部变量隐藏类成员

这是您在构造函数中看到的。然后,当您尝试链接另一个方法中的类成员时,链接器发现它已声明但未定义,因此放弃

您可能无论如何都不应该初始化构造函数中的静态类成员,因为该类只有一个变量,但每个实例都会调用一次构造函数。您应该在任何函数外部(或仅在声明中)定义该变量,除非您想对API的用户隐藏该值