Skip to content
  • 首页
  • 留言
  • 关于

Share the joys of programming and technology

调用另外一个项目中的函数-设计模式解耦

调用另外一个项目中的函数-设计模式解耦

2021年3月15日 liyanliang Comments 0 Comment
阅读次数: 92

背景描述

现需要在项目 CDP_cmd 中调用项目 CDP_dgnCalc 类CAnalRstHelper_JTGTJ212011中的函数:

BOOL GetElemValuePositiveOrNegativeMy(IN OUT TElemPosition& tElemPos,OUT double& dCtrlValue, BOOL bPositive);

解决方法

1.查看项目属性,发现项目CDP_cmd和项目CDP_dgnCalc均引用项目CDP_db,故可在CDP_db中添加一个纯虚基类(接口)。

IAnalRstHelper_JTGTJ212011.h

#pragma once
class CNSDocBase;
struct TElemPosition;
class CAnalRstHelper_JTGTJ212011;
​
#include "HeaderPre.h"
class __MY_EXT_CLASS__ IAnalRstHelper_JTGTJ212011
{
public:
    IAnalRstHelper_JTGTJ212011(void);
    virtual ~IAnalRstHelper_JTGTJ212011(void);
    static CAnalRstHelper_JTGTJ212011* GetInstance();
    static void SetInstance(CAnalRstHelper_JTGTJ212011* pSingleton);  // 多态
    static void DeleteInstance();
protected:
    static CAnalRstHelper_JTGTJ212011* m_pSingleton;  // 单例
​
public:
    // 下面这3个函数是我们需要在另外一个模块中调用的函数,把它们设为需接口
    virtual BOOL GetElemValuePositiveOrNegativeMy(IN OUT TElemPosition& tElemPos,OUT double& dCtrlValue, BOOL bPositive) = 0;
    virtual BOOL GetElemValueMymax(IN const TElemPosition& tElemPos,OUT double& dCtrlValue) = 0;
    virtual BOOL GetElemValueAbsFzmax(IN const TElemPosition& tElemPos,OUT double& dCtrlValue, OUT BOOL bMax) = 0;
};
#include "HeaderPost.h"

IAnalRstHelper_JTGTJ212011.cpp

#include "stdafx.h"
#include "IAnalRstHelper_JTGTJ212011.h"
​
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
​
class CAnalRstHelper_JTGTJ212011;
​
CAnalRstHelper_JTGTJ212011* IAnalRstHelper_JTGTJ212011::m_pSingleton = nullptr;
​
IAnalRstHelper_JTGTJ212011::IAnalRstHelper_JTGTJ212011()
{
​
}
​
IAnalRstHelper_JTGTJ212011::~IAnalRstHelper_JTGTJ212011(void)
{
​
}
​
CAnalRstHelper_JTGTJ212011* IAnalRstHelper_JTGTJ212011::GetInstance()
{
    return m_pSingleton;
}
​
void IAnalRstHelper_JTGTJ212011::SetInstance(CAnalRstHelper_JTGTJ212011* pSingleton)
{
    m_pSingleton = pSingleton;
}
​
void IAnalRstHelper_JTGTJ212011::DeleteInstance()
{
    if (m_pSingleton)
    {
        delete m_pSingleton;
        m_pSingleton = nullptr;
    }
}

2.使子类CAnalRstHelper_JTGTJ212011继承于虚基类IAnalRstHelper_JTGTJ212011

CAnalRstHelper_JTGTJ212011.h

#pragma once
#include "../CDP_db/IAnalRstHelper_JTGTJ212011.h"
​
#include "HeaderPre.h"
class __MY_EXT_CLASS__ CAnalRstHelper_JTGTJ212011 : public IAnalRstHelper_JTGTJ212011
{
public:
    CAnalRstHelper_JTGTJ212011();
    CAnalRstHelper_JTGTJ212011();
    virtual ~CAnalRstHelper_JTGTJ212011(void);
​
public:
    virtual BOOL GetElemValueMymax(IN const TElemPosition& tElemPos,OUT double& dCtrlValue);
    virtual BOOL GetElemValuePositiveOrNegativeMy(IN OUT TElemPosition& tElemPos,OUT double& dCtrlValue, BOOL bPositive);
    virtual BOOL GetElemValueAbsFzmax(IN const TElemPosition& tElemPos,OUT double& dCtrlValue, OUT BOOL bMax);
};
​
#include "HeaderPost.h"

CAnalRstHelper_JTGTJ212011.cpp

// 全局函数,初始化实例
void initDgnHelper()
{   
    // 多态
    IAnalRstHelper_JTGTJ212011::SetInstance(new CAnalRstHelper_JTGTJ212011());
}
​
void uninitDgnHelper()
{   
    IAnalRstHelper_JTGTJ212011::DeleteInstance();
}

3.在模块CDP_dgnCalc的dllmain.cpp中初始化实例和析构实例内存

dllmain.cpp

#include "stdafx.h"
#include "dllmain.h"
#include <afxwin.h>
#include <afxdllx.h>
​
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
​
// 声明为外部函数
extern void initDgnHelper();  
extern void uninitDgnHelper();
​
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
​
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        initDgnHelper(); // 初始化实例
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        uninitDgnHelper(); // 析构实例
    }
    return 1;   // 犬牢
}
​

4.使用:在模块CDP_cmd的CMCtseDlg.cpp中调用函数

BOOL CCMCtseDlg::GetMaxPositiveOrMinNegativeMy(const TArraySpanInfo& taSpanInfo, OUT TElemPosition& ElemPos, BOOL bPositive) const
{
    ElemPos = curElemPos;
    double dNextElemMy = 0.0;
​
    // 获取实例
    CAnalRstHelper_JTGTJ212011* pAnalRstHelper = IAnalRstHelper_JTGTJ212011::GetInstance(); 
    
    // 调用实例CAnalRstHelper_JTGTJ212011中的函数
    if (!pAnalRstHelper->GetElemValuePositiveOrNegativeMy(nextElemPos, dNextElemMy, bPositive))
    {
        ASSERT(0);
    }
    
    return TRUE;
}

总结:

本方法主要利用C++的多态特性,在虚接口类中IAnalRstHelper_JTGTJ212011new一个CAnalRstHelper_JTGTJ212011的实例,在使用时虽然用的是接口类指针,但实际上其调用的是子类CAnalRstHelper_JTGTJ212011的函数。

相关文章

  • WinDbg检查内存泄漏WinDbg检查内存泄漏
  • 两跨连续梁影响线绘制-附源码两跨连续梁影响线绘制-附源码
  • Midas XD-选筋助手开发Midas XD-选筋助手开发
  • 给不规则的多边形闭合区域填充颜色给不规则的多边形闭合区域填充颜色
  • 对话框加载位图及拉伸后位图重叠问题对话框加载位图及拉伸后位图重叠问题
  • OpenGL 几何着色器的应用OpenGL 几何着色器的应用

C++

Post navigation

PREVIOUS
从DLL中动态加载一个函数:LoadLibrary和GetProcAddress的使用
NEXT
设计模式-抽象工厂模式

发表回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

近期文章

  • Games101和Games202脑图汇总
  • LearnOpenGL脑图汇总
  • IBL计算总结
  • C++实现一个简单的语言解释器
  • OpenGL-法线贴图(Normal Mapping)
  • OpenGL-卡通着色(Cartoon)
  • OpenGL几何着色器实现贝塞尔曲线
  • WinDbg检查内存泄漏
  • OpenGL雾化效果实现-每像素雾化
  • OpenGL实现billboard效果(CPU)
  • 算法:寻找异常数字
  • OpenGL 几何着色器的应用
  • Midas XD-构件详图开发
  • Midas XD-选筋助手开发
  • Civil Designer开发-检测规范自动生成控制截面
  • Civil Designer开发-公路桥梁承载能力检算评定
  • Midas W-满堂支架快速建模助手开发
  • OpenGL绘制桥梁模型
  • Modern OpenGL绘制圆柱体
  • WordPress分页插件 – WP-PageNavi的使用(替换现有脚本)

全站热点

  • C++编写的情人节小程序 (1,540)
  • Modern OpenGL绘制圆柱体 (759)
  • 提取最小封闭区域 (714)
  • 截面特性计算程序-附源码 (569)
  • 判断一个点是否在闭合区域内 (565)
  • OpenGL开发环境搭建-GLFW与GLAD配置 超详细 (503)
  • OpenGL绘制旋转立方体 (462)
  • Midas XD [错误] 右侧挡土墙的最下端深度必须小于地基的最下端深度 (438)
  • WordPress分页插件 – WP-PageNavi的使用(替换现有脚本) (395)
  • 使用ODA数据库出现 “ODA_ASSUME”: 找不到标识符的错误 (364)
  • 土木想往土木软件开发方向发展,应该如何准备 (361)
  • #pragma message 编译时提示信息 (336)
  • 从DLL中动态加载一个函数:LoadLibrary和GetProcAddress的使用 (331)
  • Midas W-满堂支架快速建模助手开发 (326)
  • midas XD2020的开发 (324)
  • 两跨连续梁影响线绘制-附源码 (320)
  • 算法:寻找异常数字 (260)
  • OpenGL几何着色器实现贝塞尔曲线 (200)
  • OpenGL实现billboard效果(CPU) (196)
  • 通过Spy++抓取窗口以查询对话框id (189)

分类

  • C# (3)
  • C++ (17)
  • MFC (3)
  • ObjectARX (2)
  • OpenGL (11)
  • Revit开发 (1)
  • 学习笔记 (2)
  • 岩土 (2)
  • 算法 (1)
  • 结构设计 (7)
  • 职场生涯 (1)
  • 计算几何 (3)

归档

  • 2023年3月 (2)
  • 2022年10月 (1)
  • 2022年3月 (1)
  • 2022年2月 (1)
  • 2022年1月 (5)
  • 2021年11月 (7)
  • 2021年6月 (3)
  • 2021年5月 (2)
  • 2021年3月 (2)
  • 2021年2月 (8)
  • 2021年1月 (18)

标签

Bezier Curves BillBoard C++ CDN CivilDesigner DLL EasyX fog MFC Midas W Midas XD NormalMapping ObjectARX ODA OpenGL OpenXML Open XML PBR revit WinDbg 基坑设计 影响线 截面特性 桥梁 桥梁检测 桥梁设计 算法 计算几何 设计模式

书签

  • 李燕良的CSDN
  • 崔济东的博客
  • C++爱好者博客
  • 陈学伟的博客
  • 贾苏的博客
  • 陈睦锋的博客
  • 孙勇的博客

统计

  • 0
  • 23
  • 10
  • 73
  • 29
  • 77,669
  • 24,003

实时访问地域

© 2023   liyanliang.net Copyright. All Rights Reserved.