반응형
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를 가져다 쓸 수 있게 된다.
반응형
'C++ > 기타' 카테고리의 다른 글
[C++ 11] 정규 표현식 std::regex (2) (0) | 2023.04.23 |
---|---|
[C++ 11] 정규 표현식 std::regex (1) (0) | 2023.04.23 |
[C++] DLL로 class export / import - 1 (0) | 2023.03.16 |
[C++ Metaprogramming] enable_if / enable_if_t (0) | 2023.03.07 |
[C++ String] string 나누기. string split (0) | 2023.03.04 |