WTL头文件外如何实现?

Posted

技术标签:

【中文标题】WTL头文件外如何实现?【英文标题】:How to implement out of WTL header file? 【发布时间】:2017-06-08 16:28:29 【问题描述】:

WTL是模板库,所以我必须在模板库头文件中实现它。

我想在.cpp 文件中实现我的逻辑,否则我将不得不编写一个巨大的头文件。

例如,在 MainFrm.h

// ...
// MainFrm.h
class CMainFrame : 
    public CFrameWindowImpl<CMainFrame>, 
    public CUpdateUI<CMainFrame>,
    public CMessageFilter, public CIdleHandler

  //...
  void function1()
  
    //...
  

  void function2()
  
    //...
  

我想在myfunction.cpp中有function1()function2(),怎么办?

请指导。

编辑:

解决了!感谢 Jan S。我已将 myfunction.cpp 包含到 WTL 项目中并添加了一些行:

MainFrm.h:

// ...
// MainFrm.h
#if 1
#include <atlframe.h>
#include <atlsplit.h>
#include <atlctrls.h>
#include <atlctrlw.h>
#include <atlctrlx.h>
#include "sampleView.h"
#include "resource.h"
#endif

// MainFrm.h
class CMainFrame : 
    public CFrameWindowImpl<CMainFrame>, 
    public CUpdateUI<CMainFrame>,
    public CMessageFilter, public CIdleHandler

  //...
  void functionx();
  //...
;

myfunction.cpp:

// myfunction.cpp
#include "stdafx.h" 
#include "MainFrm.h"
void CMainFrame::functionx()

  //...

【问题讨论】:

c++定义和声明***.com/questions/1410563/…的区别@ 在显式实例化模板之前,您可能正在考虑模板***.com/questions/495021/… 【参考方案1】:

在您的标题中放置声明

// MainFrm.h
class CMainFrame : 
    public CFrameWindowImpl<CMainFrame>, 
    public CUpdateUI<CMainFrame>,
    public CMessageFilter, public CIdleHandler

  //...
  void functionx();
  //...
;

在您的 .cpp 文件中放置定义

#include MainFrm.h

void CMainFrame::functionx()  
  
    // more code  
 

编译器错误

您似乎缺少 WTL 标头包含

#include <atlframe.h>
#include <atlsplit.h>

题外话,但在你的标题中确保你有

#pragma once

#ifndef UNIQUE_HEADER_NAME
#define UNIQUE_HEADER_NAME
//header code
#endif

这将停止重复声明。

【讨论】:

#ifndef 应该在头文件的开头,#endif 应该在头文件的末尾

以上是关于WTL头文件外如何实现?的主要内容,如果未能解决你的问题,请参考以下文章

WTL自定义控件:需要的头文件

C#如何实现上传头像,最好能够代码加文字阐述一下实现原理

WTL利用CIndirectDialogImpl实现InputBox

如何编译头文件、实现文件、驱动文件

C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

如何实现给定头文件的接口?