田舎暮らしエンジニアの備忘録

2021.07.10
XML
カテゴリ: C++
サンプルコード

外部公開用ヘッダ(EXE側と共有する)
// Interface.h
#pragma once

#ifdef  INTERFACE_EXPORTS
#define  _INTERFACE_API  __declspec (dllexport)
#else
#define  _INTERFACE_API
#endif

class  _INTERFACE_API  Interface {
public:
virtual void set ( int in_data ) =  0 ;
virtual int get () =  0 ;
};

class  _INTERFACE_API  InternalAccess {
public :
virtual ~InternalAccess () {}
virtual Interface & GetIF ()  const  =  0 ;
virtual Interface & GetIF () =  0 ;
};

namespace InterfaceManager {
    _INTERFACE_API InternalAccess*  IF_Access ();
}

#include <memory>
struct  _INTERFACE_API  Interface_deleter {
public:
void operator() ( Interface * p );
};

ライブラリ内部
// Interface.cpp
#include "Interface.h"
#include "Internal.h"

namespace InterfaceManager {
_INTERFACE_API InternalAccess IF_Access () {
return new Internal {};
    }
}
void Interface_deleter :: operator() ( Interface * p ) { delete p ; }

//  Internal.h
#pragma once
#include "Interface.h"
class InternalFunc ;
class Internal  :  public InternalAccess {
public:
Internal ();
virtual ~Internal ();
virtual Interface & GetIF ()  const override ;
virtual Interface & GetIF ()  override ;
private:
InternalFunc if_ptr ;
};

// Internal.cpp
#include "Internal.h"
#include "InternalFunc.h"
Internal :: Internal () { if_ptr  =  new InternalFunc ; }
Internal :: ~ Internal () {
if  ( if_ptr  !=  nullptr ) {
delete ( if_ptr );
if_ptr  =  nullptr ;
    }
}
// 実処理へのアクセス
Interface & Internal :: GetIF () { return  * if_ptr ; }
Interface & Internal :: GetIF ()  const return  * if_ptr ; }

// InternalFunc.h
#pragma once
#include "Internal.h"
#include "Interface.h"
class InternalFunc  :  public Interface
{
public:
InternalFunc ();
virtual ~InternalFunc ();
// 実際に使用したい関数
void set ( int in_data );
int get ();
private:
int internal_data  =  0 ;
};

//  InternalFunc.cpp
#include "InternalFunc.h"
InternalFunc :: InternalFunc () {}
InternalFunc :: ~ InternalFunc () {}
void InternalFunc :: set ( int in_data ) { internal_data  =  in_data ; }
int InternalFunc :: get () { return internal_data ; }


ライブラリ利用側
#include <iostream>
#include "Interface.h"
int main () {
auto interface_access  =  InterfaceManager :: IF_Access ();
interface_access -> GetIF (). set ( 15 );
std :: cout << interface_access -> GetIF (). get ();
delete interface_access ;
}

実行結果


ライブラリ内のクラスを利用してデータの設定、取得ができる。






お中元 御中元 ギフト プレゼント 送料無料 北海道 デコレーションアイスクリーム.6個セット スイーツ. 夏ギフト スイーツ 食品 ご当地 お土産 お取り寄せグルメ 詰め合わせ 贈り物 パフェ 【S01】【S】 ​​
【クーポンで5%OFF&P5倍】お中元\送料無料/ 牛たん詰合せ 2包み入り厚切り芯たん130g・味噌仕込み100g【牛タン 牛肉 肉 ギフト 仙台 御中元】RME-30





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2021.07.10 15:58:51
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: