以下の内容はhttps://ryuichi1208.hateblo.jp/entry/2025/02/01/000000より取得しました。


【C言語】C++から呼び出す

概要

SingletonClass をシングルトンとして実装し、C 言語から呼び出せるようにラッパーを提供する。

手順

1. SingletonClass.hpp の作成

  • シングルトンのクラス SingletonClass を定義します。
  • プライベートコンストラクタを使用し、コピーコンストラクタと代入演算子を削除してシングルトンを実現します。

2. SingletonClass.cpp の作成

  • SingletonClass の実装を記述します。
  • インスタンスは静的メンバ変数として確保します。
  • getInstance() メソッドでインスタンスを返します。

3. c_interface_wrapper.cppc_interface_wrapper.hの作成

  • extern "C" ブロック内に C 言語から呼び出せる関数を定義します。
  • シングルトンインスタンスgetInstance() で取得してメソッドを呼び出すようにします。

4. main.c の作成

  • C 言語から SingletonClass のメソッドを呼び出すコードを記述します。
  • #ifdef __cplusplus ディレクティブで C++ と 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;
}



以上の内容はhttps://ryuichi1208.hateblo.jp/entry/2025/02/01/000000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14