关闭

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

550人阅读 评论(0) 收藏 举报
分类:

在一个类中有一个表态成员,但出现连接错误
#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文件中不初始化, 构造函数在哪执行呢?

 

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:978279次
    • 积分:17617
    • 等级:
    • 排名:第540名
    • 原创:741篇
    • 转载:522篇
    • 译文:0篇
    • 评论:105条
    最新评论