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

发布时间:2016-12-8 16:02:27 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"VC++ 申明静态变量的注意事项",主要涉及到VC++ 申明静态变量的注意事项方面的内容,对于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" ([email protected]@@[email protected]?$char_trai [email protected]@std@@[email protected]@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:  可以看见,运行正常.

上一篇:boost.any 容器
下一篇:Vss2005局域网开发权限设置指南

相关文章

相关评论