not good but great

プログラミング、アート、映画・本の感想について書きます。

cppで他のクラスで宣言したインスタンスを別のクラスで使う

アドレスを渡して解決

同じインスタンス名で宣言し直しても使えないので、アドレスを渡して解決します。

参考

こちらのページを参考にしました。
サービス終了のお知らせ

クラス宣言

#include <iostream>
using namespace std;

class Particle{
public:
	float x;
	float y;

	void setup();
	void calc();
};

void Particle::setup(){
	x = 1;
	y = 2;
}
void Particle::calc(){
	cout << x + y << endl;
}

インスタンスをそのまま使う

int main(){
	void test();

	Particle pa;

	pa.setup();

	test();

	return 0;
}

void test(){
	pa.calc();
}

error: use of undeclared identifier 'pa'

paを宣言していないと怒られます。

同じインスタンスを宣言する

void test(){
	Particle pa;
	pa.calc();
}

これでいけるだろうと思ったら・・・

1.39537e+16

こんなわけのわからない数字が・・・・。おそらく宣言されたx,yに入っていたアドレスの番地が足されたのかもしれません。

アドレスを渡す

int main(){
	void test(Particle*);

	Particle pa;

	pa.setup();

	Particle* address = &pa;

	test(address);

	return 0;
}

void test(Particle* address){

	(*address).calc();
}

ポインタ変数(インスタンス?)としてaddressを宣言し、そこにインスタンスであるpaのアドレスを&をつけて渡します。floatやintではなくParticleをつけて宣言するのは、Particleという型?の分だけメモリを確保する必要があるからだと思います。

*をつけるとポインタ変数に入った番地に入ってる値を示します。ここではpaと同じものを指します。

3

実行すると正しい結果になりました。

違う書き方

void test(Particle* address){
	address->calc();
}

ちなみ記号を使って上のように書くこともできます。