我在访问我的类私有成员变量部分中定义的静态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;
}
答案 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用户的值)。