【问题标题】:C++ Class Static variable problem - C programmer new to C++C++类静态变量问题——C++新手
【发布时间】:2010-05-02 20:01:23
【问题描述】:

我是一名 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。

请帮帮我。

问候,

微内核

【问题讨论】:

  • 我想要的只是保持活动会话的数量......那我该怎么做呢?如果它可以全局访问,那么类外的任何人都可以访问和更改变量!!!
  • 保留以_ 开头的全局名称。您正在编写表现出未定义行为的代码。

标签: c++ compiler-errors static-members


【解决方案1】:

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

例如在全球范围内:

int _filter_session::session_count;

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

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

【讨论】:

  • 我认为这确实是在编译单元上完成的,或者我在这里把事情搞混了。在标题中这样做很可能会导致多重定义的符号。
  • 是的,它需要满足 ODR 并且在程序中只定义一次,但是由于构造函数和析构函数也在同一块代码中被定义为“不合时宜”,我猜测这不是标题,或者无论如何只能包含一次。
  • 是的,这些函数在一个单独的 C++ 文件中。感谢您指出,没想到它;)
【解决方案2】:

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

typedef class _filter_session
{
  ...
}FILTER_SESSION;

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

class filter_session
{
  ...
};

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

【讨论】:

    【解决方案3】:

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

    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->(正如另一个成员提到的,变量不是对象的属性,而是类的属性。认为它是命名空间的全局变量)

    【讨论】:

    • 非成员函数可以访问的静态变量也是如此。如果是这样,如何确保 session_count 拥有活动会话数?感谢您的回复:)
    • 不,它不能被访问,因为它被声明为私有的。您可以以这种方式对其进行初始化这一事实并不意味着您可以在类之外访问它。
    【解决方案4】:

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

    编辑好的,我的回答没有解决问题,但是Charles Bailey`s 可以。

    【讨论】:

    • 我想要的只是保持活动会话的数量......那我该怎么做呢?如果它可以全局访问,那么类外的任何人都可以访问和更改变量!!!
    • @Microkernel:你错过了 Space_C0wb0y 的观点。在session_count 类内部无论如何都会解析为_filter_session::session_count。因为它是一个静态变量this->session_count_filter_session::session_countsession_count 都引用同一个对象。不建议您将变量设为全局变量。
    • 变量仍然被封装在类中。
    猜你喜欢
    • 2011-02-01
    • 2010-10-19
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多