通过类成员函数访问静态const变量的问题

时间:2009-05-22 15:11:11

标签: c++

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

#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()
{

当取消注释下一行时,我收到以下错误消息:

行位置工具:0:“TestStaticVariables :: static_double_variable”,引自:

 //cout << static_double_variable;
}

int main(int argc, char* const argv[])
{

 TestStaticVariables test_instance;

 return 0;
}

4 个答案:

答案 0 :(得分:9)

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

#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;
}

答案 1 :(得分:2)

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

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

   // Initialization:
   static_double_variable = 20.0;

但当然这实际上不会起作用,因为它是对const变量的赋值,而你还有第二个问题,我认为这实际上是导致你看到的错误。当你写:

  // Private member variable:
 static const double static_double_variable;

您声明这样的变量将存在。但是,您实际上并没有定义该变量(即指示编译器为其创建存储空间)。

为了做到这一点,并在class { }构造之外修复你的问题,你会写:

 const double  TestStaticVariables::static_double_variable = 20.0;

这两个都定义了变量并给它一个初始的常量值。

如果不清楚,这个问题也在C ++ FAQ中简洁地描述: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.10

答案 2 :(得分:2)

你在构造函数中做的是隐藏成员变量 您必须在类声明之外初始化static_double_variable

答案 3 :(得分:1)

您的构造函数声明并定义了一个本地静态变量,它恰好与类静态成员变量具有相同的名称。局部变量隐藏了类成员。

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

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