ページ 11

Singletonクラスのメンバ関数でアクセス違反が・・・

Posted: 2016年2月03日(水) 06:01
by seisuu_ryokutya
はじめまして。C++で質問があります。
こういった場での質問は不慣れなものでお見苦しい点があればご容赦下さい。

以下のようなソースコードを書いて実行したら 
void Singleton::Set_num(int set_num)のnum = set_num;の部分で
0xC0000005: 場所 0x00000000 への書き込み中にアクセス違反が発生しました。というエラーが出ました。

どうしたらSingletonクラスのメンバ変数numをメンバ関数を用いて設定、取得できるようになるのでしょうか?

コード:

#include <stdio.h>

class Singleton
{
private:
	int num;
	static Singleton* singleton;

private:
	Singleton(){};

public:
	static Singleton* GetInstance(){ return singleton; }

	int Get_num();
	void Set_num(int);

};

Singleton* Singleton::singleton;


int Singleton::Get_num()
{
	return num;
}
void Singleton::Set_num(int set_num)
{
	num = set_num;
}


int main(void)
{
	Singleton* hoge = Singleton::GetInstance();
	hoge->Set_num(60);
	
	printf("hoge->num  %d\n", hoge->Get_num());
	
	getchar();
	return 0;
}
あまり、C++に関して詳しくはないので、具体的なソースコードで回答していただければ助かります。

Re: Singletonクラスのメンバ関数でアクセス違反が・・・

Posted: 2016年2月03日(水) 07:42
by みけCAT
変数を作るだけでなく、インスタンスを入れておかなければいけません。

コード:

Singleton* Singleton::singleton;

コード:

Singleton* Singleton::singleton = new Singleton();

Re: Singletonクラスのメンバ関数でアクセス違反が・・・

Posted: 2016年2月03日(水) 07:50
by みけCAT
さっきのコードだとnewしたオブジェクトがdeleteされず気持ち悪いので、静的ローカル変数を使った方がいいかもしれません。

コード:

#include <stdio.h>

class Singleton
{
private:
	int num;

private:
	Singleton(){}

public:
	static Singleton* GetInstance(){
		static Singleton singleton;
		return &singleton;
	}

	int Get_num();
	void Set_num(int);

};

int Singleton::Get_num()
{
	return num;
}
void Singleton::Set_num(int set_num)
{
	num = set_num;
}

int main(void)
{
	Singleton* hoge = Singleton::GetInstance();
	hoge->Set_num(60);
	
	printf("hoge->num  %d\n", hoge->Get_num());
	
	getchar();
	return 0;
}

Re: Singletonクラスのメンバ関数でアクセス違反が・・・

Posted: 2016年2月03日(水) 07:59
by seisuu_ryokutya
みけCATさん、ありがとうございました。
これで、今、書いているプログラムの続きを書くとこができます。
また何か、解らないことがあった時はこの掲示板にお世話になるかもしれません。
その時はよろしくお願いします。