C++;类静态变量问题-C程序员新到C++; 我是C程序员,但已经学了C++ +学校的长期后台。现在我尝试在C++中编写代码,但会导致编译器错误。请检查并告诉我我的代码有什么问题 typedef class _filter_session { private: static int session_count; /* Number of sessions count -- Static */ public: _filter_session(); /* Constructor */ ~_filter_session(); /* Destructor */ }FILTER_SESSION; _filter_session::_filter_session(void) { (this->session_count)++; return; } _filter_session::~_filter_session(void) { (this->session_count)--; return; }
我得到的错误是 “错误LNK2001:未解析的外部符号”专用:静态整数筛选器会话::会话计数”(?会话_count@_filter_session@@0公顷) 顺便说一下,我正在使用VisualStudio2005 请帮帮我 问候,C++;类静态变量问题-C程序员新到C++; 我是C程序员,但已经学了C++ +学校的长期后台。现在我尝试在C++中编写代码,但会导致编译器错误。请检查并告诉我我的代码有什么问题 typedef class _filter_session { private: static int session_count; /* Number of sessions count -- Static */ public: _filter_session(); /* Constructor */ ~_filter_session(); /* Destructor */ }FILTER_SESSION; _filter_session::_filter_session(void) { (this->session_count)++; return; } _filter_session::~_filter_session(void) { (this->session_count)--; return; },c++,compiler-errors,static-members,C++,Compiler Errors,Static Members,我得到的错误是 “错误LNK2001:未解析的外部符号”专用:静态整数筛选器会话::会话计数”(?会话_count@_filter_session@@0公顷) 顺便说一下,我正在使用VisualStudio2005 请帮帮我 问候, 微核只需使用session\u count++。静态变量不绑定到类的任何实例,因此不能通过此指针访问它。类的所有实例共享一个会话\u计数的实例。事实上,即使不存在类的实例,也可以访问会话计数 编辑好的,我的答案没有解决问题,但是解决了。只需使用session\u c
微核只需使用
session\u count++
。静态变量不绑定到类的任何实例,因此不能通过此
指针访问它。类的所有实例共享一个会话\u计数的实例。事实上,即使不存在类的实例,也可以访问会话计数
编辑好的,我的答案没有解决问题,但是解决了。只需使用session\u count++
。静态变量不绑定到类的任何实例,因此不能通过此
指针访问它。类的所有实例共享一个会话\u计数的实例。事实上,即使不存在类的实例,也可以访问会话计数
编辑好的,我的答案没有解决问题,但是解决了。静态
变量需要在类主体之外的某个地方定义。类主体内的声明只是一个声明
例如,在全球范围内:
int _filter_session::session_count;
您需要确保此定义在程序中只出现一次,因此通常将其放在源文件(.cc
或.cpp
)中,而不是包含在多个翻译单元中的头文件中
为了便于移植,您应该避免使用以开头的类名。也几乎不需要typedef
您的类名<代码>类名{///…> /COD>在C++中引入了一个类型名称,不必使用<代码>类名<代码>来引用类型。<> p>代码>静态< /COD>变量需要在类体的外部定义。类体中的声明只是声明。< /P>
例如,在全球范围内:
int _filter_session::session_count;
您需要确保此定义在程序中只出现一次,因此通常将其放在源文件(.cc
或.cpp
)中,而不是包含在多个翻译单元中的头文件中
为了便于移植,您应该避免使用以开头的类名。也不需要typedef
您的类名。类名{//.<…/C> >在C++中引入了一个类型名称,您不必使用<代码>类名< /C>来引用类型。< P>不与您的问题有关,但是在C++中,不需要TyEuff类和结构如下:
typedef class _filter_session
{
...
}FILTER_SESSION;
你可以也应该简单地说:
class filter_session
{
...
};
<>也,C;LASS名称不应该是大写的,因为人们会把它们与宏混淆。而且你很少需要使用<代码> ->< /C>构造-你的代码当然不。< P>不与你的问题有关,但是在C++中,不需要TyEuff类和结构类似于:
typedef class _filter_session
{
...
}FILTER_SESSION;
你可以也应该简单地说:
class filter_session
{
...
};
此外,c;类名称通常不应为大写,因为人们会将其与宏混淆。而且您很少需要使用this->
构造-您的代码当然不需要。您需要初始化静态变量。此代码实际上编译:
typedef class _filter_session
{
private:
static int session_count; /* Number of sessions count -- Static */
public:
_filter_session(); /* Constructor */
~_filter_session(); /* Destructor */
}; // FILTER_SESSION;
int _filter_session::session_count = 0;
_filter_session::_filter_session(void)
{
session_count++;
return;
}
_filter_session::~_filter_session(void)
{
session_count--;
return;
}
int main(int argc, const char **argv)
{
return 0;
}
注意,我对要在g++/Linux上编译的FILTER_会话进行了注释,还添加了一个main并删除了this->(正如另一个成员提到的,该变量不是对象的属性,而是类的属性。将其视为一个命名空间全局变量)您需要初始化静态变量。此代码实际上编译:
typedef class _filter_session
{
private:
static int session_count; /* Number of sessions count -- Static */
public:
_filter_session(); /* Constructor */
~_filter_session(); /* Destructor */
}; // FILTER_SESSION;
int _filter_session::session_count = 0;
_filter_session::_filter_session(void)
{
session_count++;
return;
}
_filter_session::~_filter_session(void)
{
session_count--;
return;
}
int main(int argc, const char **argv)
{
return 0;
}
注意,我对要在g++/Linux上编译的FILTER_会话进行了注释,还添加了一个main并删除了this->(正如另一个成员提到的,该变量不是对象的属性,而是类的属性。将其视为一个命名空间全局变量)我认为这确实是在编译单元上完成的,或者我在这里把事情混在一起了。在头中这样做很可能会导致多个定义的符号。是的,它需要满足ODR,并且只在程序中定义一次,但由于构造函数和析构函数也在我之前使用的同一代码块中定义为“脱线”要知道这不是头,或者只能包括一次。是的,功能在一个单独的C++文件中。谢谢你指出,没有想到它;我想这是在编译单元上完成的,或者是我把事情混合在一起。在一个标题中这样做很可能会产生多个定义的符号。是的,它需要S。在程序中仅定义一次ODR,只定义一次,但由于构造函数和析构函数在同一代码块中也被定义为“不规则”,所以我猜想这不是一个头,或者必须只包含一次。是的,函数在一个单独的C++文件中。谢谢指出,没有想到它;他计算了活动会话的数量……那么我该怎么做呢?如果它是全局可访问的,那么类外的任何人都可以访问和更改该变量!!!@Microkernel:你错过了Space\u c0w0y的要点。在类内会话\u count
解析为\u filter\u session::session\u count
。因为它是一个静态变量this->session\u count
、\u filter\u session::session\u count
和session\u count
都引用同一个对象。不建议将变量设置为全局变量。该变量仍封装在类中。我只想保持活动会话数的计数……那么我该怎么做?如果它是全局可访问的e、 班外的任何人都可以访问和更改变量!!!@Microkernel:您错过了Spac