在一个类中有一个表态成员,但出现连接错误
#pragma once
#include "afx.h"
class CLogProcedure
{
public:
CLogProcedure(void);
~CLogProcedure(void);
static voidCreateLogFile();
static void LogWriteFile( DWORDdwErrorLevel, LPCTSTR lpOutputString, LPCTSTR lpfunc, INT iline);
enum E_LOG_OUTPUT_LEVEL
{
E_LOGLEVEL_FAILED= -1 ,
E_LOGLEVEL_INFORMATION= 0 ,
E_LOGLEVEL_SUCCEEDED= 1
};
private:
static CStdioFile m_plogFile;//出现问题的语句
};
出现的错误为:
Linking...
MY.obj : error LNK2001: unresolved external symbol "private: static class CStdioFile CMY::m_myFile" (?m_myFile@CMY@@0VCStdioFile@@A)
Debug/test1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
test1.exe - 2 error(s), 0 warning(s)
(1)开始以为是无法使用动态连接库的问题,改为静态连接库,问题依旧
(2)把构造函数改为inline 连接通过,但类无法实例化,如CMY myTest;就又出现上面的错误
(3)把m_plogFile改为非静态成员,可以解决,但是这不是我想要的答案
出现这样的问题主要有一下几个:
1、缺少相关的头文件或者库
2、那就是类头文件中声明的函数在.cpp中没有实现
3、还可能就是类中可能定义其他类的静态对象,但是没在相应的CPP文件中进行初始化
解决方案:
使用静态成员类要初始化的
是在CPP文件中加上一句
static CMY::m_plogFile;
为什么添加呢?
解释如下:
为什么要在.cpp文件中加上
CStdioFile CMY::m_plogFile;
原因如下:
1 .h文件只是类声明的地方. 所以.h文件它不会也不能产生.obj文件
2 象你这样的static类成员变量它是全局的, 因此它需要定义,需要赋初值,需要分配全局内存,这样就必须在.cpp文件中添上该语句.
试想, 假如static类成员变量是一个对象的话, 如:CStdioFile. 它还需要执行构造函数.假如在.cpp文件中不初始化, 构造函数在哪执行呢?