1

我是一名 C 程序员,但很久以前就在 @school 学习过 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:无法解析的外部符号“私有:静态 int _filter_session::session_count”(?session_count@_filter_session@@0HA)”

顺便说一句,我正在使用 Visual Studio 2005。

请帮助我。

问候,

微内核

4

4 回答 4

8

static变量需要在类主体之外的某个地方定义。类体内的声明只是一个声明

例如在全球范围内:

int _filter_session::session_count;

您需要确保此定义仅在程序中出现一次,因此通常您会将其放在源文件(.cc.cpp)中,而不是包含在多个翻译单元中的头文件中。

为了可移植性,您应该避免以_. typedef您的班级名称也几乎不需要。class Name { //...在 C++ 中引入了类型名称,您不必使用class Name来引用类型。

于 2010-05-02T11:52:13.587 回答
1

与您的问题无关,但在 C++ 中,不需要像这样 typedef 类和结构:

typedef class _filter_session
{
  ...
}FILTER_SESSION;

你可以而且应该简单地说:

class filter_session
{
  ...
};

此外,c;lass 名称通常不应大写,因为人们会将它们与宏混淆。而且您很少需要使用该this->构造-您的代码当然不需要。

于 2010-05-02T11:56:24.593 回答
1

您需要初始化静态变量。这段代码实际上编译:

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

请注意,我注释了 FILTER_SESSION 以在 g++/Linux 上编译,还添加了一个 main 并删除了 this->(正如另一个成员提到的,该变量不是对象的属性,而是类的属性。将其视为命名空间的全局多变的)

于 2010-05-02T11:56:41.553 回答
0

只需使用session_count++. 静态变量不绑定到类的任何实例,因此不能通过this-pointer 访问它。您的类的所有实例共享一个session_count. 事实上,session_count即使您的类不存在任何实例,也可以访问。

编辑好吧,我的回答并没有解决问题,但查尔斯贝利的可以。

于 2010-05-02T11:50:56.017 回答