开发工具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: 可以看见,运行正常.