MFC 在类中声明其他类的静态对象出现的问题ATPC.obj : error LNK2001 和&nbs

在一个类中有一个表态成员,但出现连接错误
#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: unresolved externals
Error executing link.exe.

test1.exe error(s), 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;

原因如下:
.h文件只是类声明的地方. 所以.h文件它不会也不能产生.obj文件
象你这样的static类成员变量它是全局的, 因此它需要定义,需要赋初值,需要分配全局内存,这样就必须在.cpp文件中添上该语句.


试想, 假如static类成员变量是一个对象的话, 如:CStdioFile. 它还需要执行构造函数.假如在.cpp文件中不初始化, 构造函数在哪执行呢?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值