zoukankan      html  css  js  c++  java
  • VC++ 申明静态变量的注意事项

    开发工具VC++ 6.0,举例类CEmployee

    按照习惯,我们在头文件中如果已经声明了变量,我们在源文件中就可以直接使用了。

       1: protected:
       2:     static string m_EmployeeName;

    我们在构造函数初始化它,

       1: CEmployee::CEmployee()
       2: {
       3:  
       4:     m_EmployeeName ="Rock";
       5: }

    编译没有问题,但连接的时候有问题:

    Linking...
    Employee.obj : error LNK2001: unresolved external symbol "protected: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > CEmployee::m_EmployeeName" (?m_EmployeeName@CEmployee@@1V?$basic_string@DU?$char_trai
    ts@D@std@@V?$allocator@D@2@@std@@A)
    Debug/TestStaticVariable.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

    正确的申明方式应该做到两点:

    1. 在头文件中申明

    2. 在源文件中再次声明。

    头文件中:

       1: private:
       2:     static string m_EmployeeName;
       3:     static int m_count;

    源文件:

       1: string CEmployee::m_EmployeeName;
       2: int CEmployee::m_count;
       3:  
       4:  
       5:  
       6: CEmployee::CEmployee()
       7: {
       8:  
       9:     m_EmployeeName ="Rock";
      10:     m_count++;
      11: }

    这样的申明方式很容易让人疑惑。

    疑惑一:源文件再次申明静态变量不需要再加static前缀。

    疑惑二:理论上,静态变量是不可继承的,因此访问方式只能是类的公开或私有。但是,我们把它定义为保护类型编译运行也没有错。

       1:  
       2: protected:
       3:     static string m_EmployeeName;
       4:     static int m_count;
       5:     

    我经常使用java或C#, 对于这种违背OO的语法自然有所疑惑. 不过:C++确实是有其与OO不同的语法之处.

    为了测试静态变量是否确实像我们想象那样,我定义几个函数,并做了测试.

    注意:静态函数的申明也如同静态变量一样.

       1: // Employee.h: interface for the CEmployee class.
       2: //
       3: //////////////////////////////////////////////////////////////////////
       4:  
       5: #if !defined(AFX_EMPLOYEE_H__CD070057_6BC8_4639_BA5B_8EBD94A191BD__INCLUDED_)
       6: #define AFX_EMPLOYEE_H__CD070057_6BC8_4639_BA5B_8EBD94A191BD__INCLUDED_
       7:  
       8: #if _MSC_VER > 1000
       9: #pragma once
      10: #endif // _MSC_VER > 1000
      11: #include <iostream>
      12: using namespace std;
      13:  
      14: class CEmployee  
      15: {
      16:  
      17: public:
      18:     CEmployee();
      19:     virtual ~CEmployee();
      20:     static intilizeCount(int in_count);
      21:     int& getCount();
      22:  
      23:     
      24:  
      25: protected:
      26:     static string m_EmployeeName;
      27:     static int m_count;
      28:     
      29:  
      30: };
      31:  
      32: #endif // !defined(AFX_EMPLOYEE_H__CD070057_6BC8_4639_BA5B_8EBD94A191BD__INCLUDED_)
       1: // Employee.cpp: implementation of the CEmployee class.
       2: //
       3: //////////////////////////////////////////////////////////////////////
       4:  
       5: #include "stdafx.h"
       6: #include "Employee.h"
       7:  
       8: //////////////////////////////////////////////////////////////////////
       9: // Construction/Destruction
      10: //////////////////////////////////////////////////////////////////////
      11:  
      12: string CEmployee::m_EmployeeName;
      13: int CEmployee::m_count;
      14:  
      15:  
      16:  
      17: CEmployee::CEmployee()
      18: {
      19:  
      20:     m_EmployeeName ="Rock";
      21:     m_count++;
      22: }
      23:  
      24: CEmployee::~CEmployee()
      25: {
      26:  
      27: }
      28:  
      29: CEmployee::intilizeCount(int in_count)
      30: {
      31:     m_count = in_count;
      32: }
      33: int& CEmployee::getCount()
      34: {
      35:     return m_count;
      36: }

    main文件:

       1: // TestStaticVariable.cpp : Defines the entry point for the console application.
       2: //
       3:  
       4: #include "stdafx.h"
       5: #include "Employee.h"
       6: #include <iostream>
       7: using namespace std;
       8:  
       9: int main(int argc, char* argv[])
      10: {
      11:     //静态调用,用类的静态函数来初始化静态变量
      12:     CEmployee::intilizeCount(0);
      13:  
      14:     
      15:     CEmployee empl;
      16:     printf("Now current instance count: %d \n", empl.getCount());
      17:  
      18:     CEmployee empl2;
      19:     printf("Now current instance count: %d \n", empl.getCount());
      20:  
      21:  
      22:     CEmployee empl3;
      23:     printf("Now current instance count: %d \n", empl.getCount());
      24:  
      25:  
      26:  
      27:     cin.get();
      28:     
      29:     return 0;
      30: }
      31:  

    image

    可以看见,运行正常.

  • 相关阅读:
    前端基础进阶(十一):详细图解jQuery对象,以及如何扩展jQuery插件
    前端基础进阶(十):面向对象实战之封装拖拽对象
    前端基础进阶(九):详解面向对象、构造函数、原型与原型链
    前端基础进阶(八):深入详解函数的柯里化
    前端基础进阶(七):函数与函数式编程
    前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包
    前端基础进阶(五):全方位解读this
    lvs健康检查脚本第三版
    rsync同步常用命令
    nginx启动脚本
  • 原文地址:https://www.cnblogs.com/king_astar/p/1574963.html
Copyright © 2011-2022 走看看