概要
SingletonClass をシングルトンとして実装し、C 言語から呼び出せるようにラッパーを提供する。
手順
1. SingletonClass.hpp の作成
2. SingletonClass.cpp の作成
3. c_interface_wrapper.cpp と c_interface_wrapper.hの作成
extern "C"ブロック内に C 言語から呼び出せる関数を定義します。- シングルトンインスタンスを
getInstance()で取得してメソッドを呼び出すようにします。
4. main.c の作成
ファイル構成
SingletonClass.hpp: クラス定義SingletonClass.cpp: クラス実装c_interface_wrapper.cpp: C 言語インタフェースラッパーc_interface_wrapper.h: C 言語インタフェースラッパー(ヘッダ)main.c: C 言語からの呼び出し例
SingletonClass.hpp
サンプルとなるシングルトンなクラス(ヘッダ)
#ifndef SINGLETONCLASS_H #define SINGLETONCLASS_H class SingletonClass { public: static SingletonClass* getInstance(); void methodA(void); void methodB(int value); private: SingletonClass() = default; // コンストラクタをプライベートにしてシングルトンを実現 SingletonClass(const SingletonClass&) = delete; // コピーコンストラクタの削除 SingletonClass& operator=(const SingletonClass&) = delete; // 代入演算子の削除 static SingletonClass instance; }; #endif
SingletonClass.cpp
サンプルとなるシングルトンなクラス(本体)
#include "SingletonClass.hpp" SingletonClass SingletonClass::instance; SingletonClass* SingletonClass::getInstance() { return &instance; } void SingletonClass::methodA(void) { // ここに処理を記述 } void SingletonClass::methodB(int value) { // ここに処理を記述 }
c_interface_wrapper.cpp
クラスをC言語から呼び出すためにエクスポートする
#include "SingletonClass.hpp" extern "C" { // C インタフェース関数 void singletonclass_methodA() { SingletonClass::getInstance()->methodA(); } void singletonclass_methodB(int value) { SingletonClass::getInstance()->methodB(value); } }
c_interface_wrapper.h
クラスをC言語から呼び出すためのヘッダ
#ifndef C_INTERFACE_WRAPPER_H #define C_INTERFACE_WRAPPER_H #ifdef __cplusplus extern "C" { #endif void singletonclass_methodA(); void singletonclass_methodB(int value); #ifdef __cplusplus } #endif #endif
main.c
#include "c_interface_wrapper.h" int main() { singletonclass_methodA(); singletonclass_methodB(42); return 0; }