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

Bmodel依赖于Amodel,但是Amodel又需要BModel的信息。这样就会导致相互依赖。


方法一:采用静态变量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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值