←HSPハック トップへ

C++のクラスをHSPに移植する

HSPのモジュールを使って移植します。

最終更新:2018/01/03

初版:2018/01/03




クラスの宣言


C++では、class クラス名ですが、HSPでは、#module クラス名になります。

例:
C++HSP
class MyClass{
//~
};
#module MyClass
//~
#global

コンストラクタ


オブジェクトが生成されるときに呼び出される初期化関数です。
HSPではnewmodを実行したときに呼ばれます。
C++にあたるコンストラクタは、HSPでは、#modinitになります。
引数はそのまま移植できます。(型はHSPのものにあわせる。)

例:
C++HSP
class MyClass{
public:
	MyClass(int p1);
};

MyClass::MyClass(int p1){ //コンストラクタ
	//~
}
#module MyClass
	#modinit int p1 //コンストラクタ
		//~
	return
#global

デストラクタ


オブジェクトが消去されるときに呼び出される関数です。
HSPではdelmodされたときに呼ばれます。 C++にあたるデストラクタは、HSPでは、#modtermになります。「Module Terminate」からとったものだと思われます。
引数はC++同様、指定しません。

例:
C++HSP
class MyClass{
public:
	MyClass(int p1);
	~MyClass();
};

MyClass::MyClass(int p1){ //コンストラクタ
	//~
}

MyClass::~MyClass(){ //デストラクタ
	//~
}
#module MyClass
	#modinit int p1 //コンストラクタ
		//~
	return
	
	#modterm //デストラクタ
		//~
	return
#global

メンバ変数


HSPでもC++のメンバ変数と同じような働きをする機能があります。(HSPでは「モジュール変数」といいます。)
HSPに移植する際、アクセス指定子は無視します。モジュール変数はすべてprivateとして扱われるためです。
モジュール変数は、#moduleの第2引数以降に「,」で区切って列挙するか、コンストラクタ内で初期化するなどして登録します。

例:
C++HSP
class MyClass{
public:
	MyClass(int p1);
	~MyClass();
private:
	int val = 0;
};

MyClass::MyClass(int p1){ //コンストラクタ
	val = p1; //valにp1を代入
}

MyClass::~MyClass(){ //デストラクタ
}
#module MyClass val
	#modinit int p1 //コンストラクタ
		val = p1//valにp1を代入
	return
	
	#modterm //デストラクタ
	return
#global

メンバ関数


C++のメンバ関数をHSPに移植するときに使うのは、#modfunc(命令)#modcfunc(関数)です。
引数はそのまま移植できます。(型はHSPのものにあわせる。)

例:
C++HSP
class MyClass{
public:
	MyClass();
	~MyClass();
	int func(int p1);
};

MyClass::MyClass(){ //コンストラクタ
}

MyClass::~MyClass(){ //デストラクタ
}

int MyClass::func(int p1){
	//~
	return 0;
}
#module MyClass
	#modinit //コンストラクタ
	return
	
	#modterm //デストラクタ
	return
	
	#modfunc func int p1
		//~
	return 0
#global

クラスのオブジェクトを生成


newmodで生成します。
newmodの第1引数にモジュール名(クラス名)、第2引数に変数名、第3引数以降に#modinitに渡す引数をすべて指定します。
例:
C++HSP
#include "stdafx.h"
#include <iostream>

class MyClass{
public:
	MyClass(int p1);
	~MyClass();
};

MyClass::MyClass(int p1){ //コンストラクタ
}

MyClass::~MyClass(){ //デストラクタ
}

int main() {
	MyClass Class1(100); //MyClass型のClass1を作成
	return 0;
}
#module MyClass
	#modinit int p1//コンストラクタ
	return
	
	#modterm //デストラクタ
	return
#global

newmod Class1, MyClass, 100 //MyClass型のClass1を作成

サンプル


2つの数値を保持し、Add関数が呼ばれるとその2つの数値の和が返るクラスです。
C++HSP
#include "stdafx.h"
#include <iostream>

class MyClass
{
public:
	MyClass(int p1, int p2);
	~MyClass();
	int Add(void);
private:
	int val1 = 0;
	int val2 = 0;
};

MyClass::MyClass(int p1, int p2) { //コンストラクタ
	val1 = p1;
	val2 = p2;
}

MyClass::~MyClass() { //デストラクタ
	val1 = 0;
	val2 = 0;
}
int MyClass::Add(void) {
	return (val1 + val2);
}

int main() {
	MyClass Class1(100, 200); //MyClass型のClass1を作成
	std::cout << "value:" << Class1.Add(); //出力
	return 0;
}
#module MyClass val1, val2
	#modinit int p1, int p2 //コンストラクタ
		val1 = p1
		val2 = p2
	return
	#modterm //デストラクタ
		val1 = 0
		val2 = 0
	return
	#modcfunc Add
	return (val1 + val2)
#global
newmod Class1, MyClass, 100, 200 //MyClass型のClass1を作成
mes "value:"+Add(Class1) //出力

stop




[前へ] [戻る] [次へ]

(C)2019 inonote / 無断転載禁止