VC++ 申明静态变量的注意事项

时间:2022-02-27 19:32:19

开发工具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:  

VC++ 申明静态变量的注意事项

可以看见,运行正常.