読者です 読者をやめる 読者になる 読者になる

Awesome Hacks!

プログラミング初心者なので地道に勉強していきます。分からない人の立場から整理していきます。

クラスの応用_クラスの型変換(未解決)

プログラミング_C++

※未解決のため、参考になりません。
 
はっきり言って、まず、現段階では用途が分からない。
とりあえず「自分の定義したクラス型←→int型」の型変換ができるとのこと。
 


見よう見まねで作ってこんな具合。
でも実行結果で出力確認しているが、この方法が適切なのかも分からない。
 
<「自分の定義したクラス←→int型」>
【プログラム】

#include <iostream>
using namespace std;

class Num {
	private:
		int num;
	public:
		Num() : num(333){}
		Num(int n){
			num = n;
		}
		operator int(){
			return num;
		}
		int getNum(){
			return num;
		}
};

int main(){
	// Numクラスの変換コンストラクタでint型をNum型に変換
	int a = 123;
//	Num n(a);			// これでも同じこと(実行可)
//	Num n = (Num)a;		// これでも同じこと(実行可)
	Num n1 = a;			// キャスト不要
	cout << "int型をNum型に変換しました" << endl;
	cout << n1.getNum() << endl;

	Num n2;
//	int b = (int)n2;	// これでも同じこと(実行可)
	int b = n2;			// キャスト不要
	cout << "Num型をint型に変換しました" << endl;
	cout << b << endl;
	return 0;
}


【実行結果】

$
int型をNum型に変換しました
123
Num型をint型に変換しました
333
$

 
 
<「自分の定義したクラス←→自分の定義したクラス」>
自分の定義したクラス同士でもできるのかも一応やってみた。
【プログラム】

#include <iostream>
using namespace std;

class classB {
	private:
		double dnum;
	public:
		classB() : dnum(12.3){}
		double getDnum(){
			return dnum;
		}
};

class classA {
	private:
		int inum;
		classB cb;
	public:
		classA() : inum(111){}
		classA(classB b){		// 変換コンストラクタ
			cb = b;
		}
		operator classB(){		// 変換関数
			return cb;
		}
		classB getCb(){
			return cb;
		}
};

int main(){
	// classAクラスの変換コンストラクタでclassB型をclassA型に変換
	classB ob;
	classA oa = ob;			// キャスト不要
	cout << "変換コンストラクタで、classB型をclassA型に変換しました" << endl;
	classB ob2 = oa.getCb();
	cout << ob2.getDnum() << "\n" << endl;

	classB ob3 = oa;
	cout << "変換関数で、classA型をclassB型に変換しました" << endl;
	cout << ob3.getDnum() << endl;

	return 0;
}


【実行結果】

$
変換コンストラクタで、classB型をclassA型に変換しました
12.3

変換関数で、classA型をclassB型に変換しました
12.3
$

 
 
用途が現段階ではっきりしないが、
おそらく「自分の定義したクラス←→int型」の中でやっているように、実際は異なるクラス間でメンバ変数の受け渡しをやって、結局地道に内部では変換先のメンバ変数に格納しているという話かもしれない(演算子オーバーロードのように・・・)
それを強引にキャスト無しで

classB b; 
classA a = b;

とできるようにしているだけのような印象(すごい安易な結論)
その過程で、内部でclassBのメンバ変数のうちclassAのオブジェクトに必要なデータを(必要であれば必要な形に変換して)取得してclassAのオブジェクトaを作っているのかもしれない。
 
ということで、いつか必要に迫られるまで「未解決」としておく(事実上の保留)