项目相互依赖调用解决方法两种方法

news2025/1/18 19:07:39

Bmodel依赖于Amodel,但是Amodel又需要BModel的信息。原来是在Amodel创建一块内存,在Bmodel中将内存地址赋给这块内存,然后在Amodel去做其他操作。


方法一:采用静态变量static链接:C++开发中一个解决方案里,两个项目的相互引用,相互依赖的实现方法(解决方法)_Capricorn_L的博客-CSDN博客

 Amodel
OperationUIManager.h

#pragma once

#ifdef AMODEL_EXPORTS
#define AMODEL_API _declspec(dllexport)
#else
#define AMODEL_API _declspec(dllimport)
#endif

class AMODEL_API OperationUIManager
{
public:
	OperationUIManager() {}
protected:
	static OperationUIManager* m_pOperationUIManager;
public:
	//将数据加入到提取的图层
	virtual int Get(int num) = 0;
	static OperationUIManager* GetManager();
};

 OperationUIManager.cpp

#include "pch.h"
#include "OperationUIManager.h"
OperationUIManager* OperationUIManager::m_pOperationUIManager = NULL;
OperationUIManager* OperationUIManager::GetManager()
{
	return m_pOperationUIManager;
}

 Bmodel
DesignUIManger.h

#ifdef BMODEL_EXPORTS
#define BMODEL_API _declspec(dllexport)
#else
#define BMODEL_API _declspec(dllimport)
#endif


class  BMODEL_API DesignUIManger :public OperationUIManager
{
public:
	static DesignUIManger& GetInstance();

private:
	DesignUIManger();
	DesignUIManger(const DesignUIManger&)=delete;
	DesignUIManger& operator=(const DesignUIManger&) = delete;
public:
	virtual int Get(int num);
};

DesignUIManger.cpp 

#include "pch.h"
#include "DesignUIManger.h"

DesignUIManger& DesignUIManger::GetInstance()
{
	static DesignUIManger m_instance;
	return m_instance;
}

int DesignUIManger::Get(int num)
{
	return num * 10;
}

DesignUIManger::DesignUIManger()
{
	OperationUIManager::m_pOperationUIManager = this;
}

DesignUIManger& m_pDesignUIManager = DesignUIManger::GetInstance();

 modelsRelation.cpp (执行 DesignUIManger::GetInstance().Get(10);是为了让程序初始化一下DesignUIManger地址)

 

方法二:采用函数指针,回调函数

 Amodel

OperationUIManager.h

#include <functional>
#ifdef AMODEL_EXPORTS
#define AMODEL_API _declspec(dllexport)
#else
#define AMODEL_API _declspec(dllimport)
#endif

using Getfun = std::function<int(int)>;

extern "C"	//以"C"的方式导出接口
{
	extern AMODEL_API Getfun GetCurDb;
}

 OperationUIManager.cpp

#include "OperationUIManager.h"

Getfun GetCurDb = nullptr;

  Bmodel
DesignUIManger.h

#include "SingletonInterface.h"

#ifdef BMODEL_EXPORTS
#define BMODEL_API _declspec(dllexport)
#else
#define BMODEL_API _declspec(dllimport)
#endif

BMODEL_API void Init();

 DesignUIManger.cpp

#include "DesignUIManger.h"
#include "../AModel/OperationUIManager.h"

int Get1(int num) { return num * 2; };


void Init()
{
	GetCurDb = Get1;
}

  modelsRelation.cpp (执行 init;是为了让程序初始化一下)

#include <iostream>
#include "../AModel/OperationUIManager.h"

#include "../BModel/DesignUIManger.h"
using namespace std;
int main()
{
    Init();
    if (GetCurDb)
    {
		cout << GetCurDb(10) << endl;
    }
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 0808. 分汤:好题【感叹号】

【LetMeFly】808.分汤&#xff1a;好题&#xff01; 力扣题目链接&#xff1a;https://leetcode.cn/problems/soup-servings/ 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。提供 75ml 的 汤A 和 2…

Google Earth Engine(GEE)—— 各矿区时序NDVI变化图(包含具体的运行函数)

函数: ee.Filter.eq(name, value) Filter to metadata equal to the given value. Returns the constructed filter. Arguments: name (String): The property name to filter on. value (Object): The value to compare against. Returns: Filter ui.Chart.image.s…

7、Jedis测试

文章目录7、Jedis测试7.1. Jedis所需要的jar包7.2. 连接Redis注意事项7.3. Jedis常用操作7.3.1. 创建动态的工程7.3.2. 创建测试程序7.4. 测试相关数据类型7.4.1. Jedis-API&#xff1a;Key7.4.2. Jedis-API&#xff1a;String7.4.3. Jedis-API&#xff1a;List7.4.4. Jedis-AP…

葡萄糖-聚乙二醇-6-羧甲基荧光素 Glucose-PEG-6-FAM

葡萄糖-聚乙二醇-6-羧甲基荧光素 Glucose-PEG-6-FAM 中文名称&#xff1a;葡萄糖-6-羧甲基荧光素 英文名称&#xff1a;Glucose-6-FAM 别称&#xff1a;6-羧甲基荧光素标记葡萄糖&#xff0c;6-羧甲基荧光素-葡萄糖 PEG接枝修饰葡萄糖 Glucose-PEG-6-FAM 葡萄糖-聚乙二醇…

需求收集方法工具,以及进行需求分析的6大要素

通过本文你将了解&#xff1a;1、需求管理流程包括哪四个步骤&#xff1b;2、如何进行需求收集&#xff1b;3、如何进行需求分析&#xff1f;4、如何进行需求分发&#xff1b;5、如何进行需求验证&#xff1b;6、有哪些辅助软件需求管理的工具系统&#xff1f;一、需求管理包括…

MyBatis核心配置文件

1.environments 注 : environments下面可以配置多个环境 , 需要使用哪个环境default里面的参数就对应哪个Id. 2.properties 配置连接 方法一 :(直接配置参数) 方法二 :(使用properties配置文件) (1)创建一个 properties 文件 , 在里面配置连接 (2)在核心配置文件中配置使用p…

41.朴素贝叶斯Naive Bayes公式推导与理解+求解公园凉鞋问题(借助文氏图)

朴素贝叶斯是基于概率论统计学的分类算法。 贝叶斯理论是指根据一个已发生事件的概率&#xff0c;计算另一个事件的发生概率。 目录 1.相关概念 1.1先验概率 应用举例 1.2条件概率 应用举例 1.3全概率公式 应用举例 1.4后验概率 应用举例 2.课堂笔记 ​ 3.文…

ubuntu16.04+cuda10.0+cudnn7.6+tensorflow_gpu-1.11.0环境安装

为了搭深度学习环境,又装了一遍各种库,在此记录安装版本和流程. ubuntu16.04cuda10.0cudnn7.6tensorflow_gpu-1.11.0环境安装1 安装NVIDIA显卡2 安装CUDA10.03 安装CUDNN4 安装tensorflow_gpu-1.11.01 安装NVIDIA显卡 查看自己的显卡型号: lspci |grep -i nvidianvidia官网:h…

linux安装Zookeeper3.5.7详解

官网下载链接&#xff1a;Apache ZooKeeper 如下图可以下载历史版本 然后找到3.5.7版本&#xff0c;直接下载即可然后将Zookeeper拷贝到一个文件夹下&#xff0c;这里我选择的是/opt/software文件夹 然后将其解压到指定目录下 tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C …

让你全方位了解tftp协议,学tftp协议不再难

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;端口号为69&#xff0c;是一种高效的文件传输方式。 其目标是在UDP之上建立一个类似于FTP的但仅支持文件上传和下载功能的传输协议&a…

【Jmeter基础篇】06:HTTP信息头管理器的使用 | 梯度加压性能测试

一、什么是信息头&#xff1f; 其实就是请求头&#xff0c;它会随着我们的HTTP请求一起发送到服务器。 二、使用场景 需要传输cookie&#xff0c;token或其他某些信息&#xff0c;或是需要伪造请求头的时候。 三、实际案例 比如我在使用Apache Jmeter发送请求的时候&#…

【Hack The Box】linux练习-- Haircut

HTB 学习笔记 【Hack The Box】linux练习-- Haircut &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f36…

Fiddler收费没得用?这款抓包神器 Github star 过万,一个字:香

关于抓包&#xff0c;那是测试人员必备技能之一了&#xff0c;通常我们会通过一些抓包工具来辅助我们测试、定位bug。 我最早接触并使用的就是 fiddler &#xff0c;不过目前最新版本已经要开始付费了&#xff0c;以前很老的那版我也不爱用了&#xff0c;这可咋整&#xff1f;…

软件测试投了几十份简历为什么没有面试邀约?

最近有不少人问&#xff0c;测试岗位&#xff0c;为啥投了简历却连一个面试机会都没有&#xff1f;如下图&#xff1a; 投3份简历没有回音&#xff0c;有可能是投的公司规模较大&#xff0c;你自身条件不过关&#xff08;如学历&#xff0c;年龄不符合要求&#xff09;。 投30…

网络是怎样连接的--DNS服务器查询原理

文章目录3.1 DNS服务器基本工作3.2 寻找相应的DNS服务器并获取ip地址3.3 通过缓存加快DNS服务器的响应3.1 DNS服务器基本工作 DNS服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应。 其中&#xff0c;来自客户端的查询消息包含以下3种信…

Java 面试题 —— 简单工厂、工厂方法、抽象工厂的区别

Java 面试题 —— 简单工厂、工厂方法、抽象工厂的区别 1、简单工厂模式 ​ 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a;又称为静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;它属于类创建型模式。 ​ 在简单工厂…

常见仿射变换矩阵

旋转&#xff08;Rotation&#xff09; def _get_rotation_matrix(rotate_degrees):radian math.radians(rotate_degrees)rotation_matrix np.array([[np.cos(radian), -np.sin(radian), 0.],[np.sin(radian), np.cos(radian), 0.], [0., 0., 1.]],dtypenp.float32)return r…

C# 学习之路(C# 的概念)

C# 学习之路&#xff08;C# 的概念&#xff09; - 什么是 C# C# 的发音是 “C sharp”&#xff0c;不是念作 “C 井”&#xff08;虽然&#xff0c;我在没有接触之前是念“C 井”&#x1f923;&#xff09;。C# 的第一个版本是 2002年发布的 C# 1.0&#xff0c;但到如今&#x…

Redis——》内存淘汰策略

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》内存淘汰策略一、内存淘汰策略二、设置缓存大小三、设置过期时间…

前端常见面试题

前端常见面试题大全前端本地存储的方式有哪些?JS 的参数是以什么方式进行传递的?js中的垃圾回收?作用域链?什么是闭包?原型 与 原型链js的继承判断一个数据是否为数组? > 数组的方法数组去重?this指向问题?Promise是什么? 构造函数 异步代码的容器手写promo深拷贝 …