C++/기타

[C++] DLL로 class export / import - 2

sseram 2023. 3. 20. 20:20
반응형

https://donot-simsim.tistory.com/22

 

[C++] DLL로 class export / import - 1

-- 전체 코드 맨 하단에 첨부 당연하게도, 솔루션이 커지면 커질수록 하나의 프로젝트에서 모든 것을 다 할 수는 없다. 그러다 보니 외부 라이브러리를 가져다 쓰는 경우가 많은데, 항상 가져다

donot-simsim.tistory.com

 

 

 

저번에 만든 dll export  class를 상속받아서 다른 일을 해 보자.

 

 

먼저 baseClass.cpp를 삭제해주고

baseClass.h를 조금 손 봐주자.

 

#pragma once


#include <map>
#include <string>
#include <iostream>


#ifdef _DLL_EXPORT
	#define CLS_TYPE __declspec (dllexport)
#else if
	#define CLS_TYPE __declspec (dllimport)
#endif

class CLS_TYPE baseClass {
public:
	baseClass() {}
	virtual ~baseClass() {}

	std::string myname;
	virtual void init(std::string name) = 0;
	virtual int money() = 0;
};

using CONSTRUCTOR = baseClass* (*)();
using DESTRUCTOR = void (*)(baseClass*);

#ifdef __cplusplus
extern "C"
{
#endif
	CLS_TYPE baseClass* BC_constructor();
	CLS_TYPE void BC_destructor(baseClass* cls);
#ifdef __cplusplus
}
#endif

 

생성자와 소멸자를 안쪽으로 옮기고, 소멸자에 virtual를 붙여 주었다.

init과 money를 순수 가상함수로 바꾸었다.

 

 

 

 

 

baseClass를 상속받은 class를 하나 만들고

#pragma once

#include "SomeBaseClass.h"

class DerivedAClass : public baseClass {
public:
	DerivedAClass();
	~DerivedAClass();

	std::string myname;
	virtual void init(std::string name) override;
	virtual int money() override;
};

 

 

 

그 구현부를 만든다.

#include "pch.h"
#include "SomeDerivedClass.h"

DerivedAClass::DerivedAClass() {
	std::cout << "create derived!" << std::endl;
	myname = "default";
}

DerivedAClass::~DerivedAClass() {
	std::cout << "destroy derived!" << std::endl;
}

void DerivedAClass::init(std::string name)
{
	myname = name;
	std::cout << "hello derived" + name << std::endl;
}

int DerivedAClass::money()
{
	return myname.size() + 3;
}

CLS_TYPE baseClass* BC_constructor() {
	return new DerivedAClass;
}

CLS_TYPE void BC_destructor(baseClass* cls) {
	delete cls;
}

 

그럼 이런 식으로 구조가 바뀔 것이다.

 

 

 

 

이 이후에 빌드를 하고 돌리면

쟈잔

 

 

main에 아무런 변화 없이 derived class 를 가져다 쓸 수 있게 되었다!

 

 

 

 

 

그래서 이걸 가지고 무엇을 할 수 있냐?

 

 

이런 식으로, base class를 engine에다 만들어 두고,

 

app 개발자들에게 SomeBaseClass만 open하면 engine에서 변경점 없이 해당 derived 된 class를 가져다 쓸 수 있게 된다.

 

 

반응형