ページ 11

private修飾子へのアクセス手段

Posted: 2009年6月23日(火) 16:19
by dic
まず以下のコードを見て欲しいです
#include	<stdio.h>
#include	<string.h>

class	A
{
private:
	char	m_name[256];
public:
	char*	SetName( char *name );
	void	Show();
};

char*	A::SetName( char *name )
{
	strcpy( m_name, name );

	printf( "%s にセットしました\n", m_name );

	return m_name;
}
void	A::Show()
{
	printf( "%s\n", m_name );
}

int	main()
{
	A	a;

	printf( "%s\n", a.SetName( "hoge" ) );

	char	*p = a.SetName( "うらしま太郎" );

	strcpy( p, "hoge" );

	a.Show();

	return 83;
}
ここで、クラスAのprivateメンバ変数へのポインタを外部変数に渡すと
簡単にprivate変数の中身が クラスA以外から簡単に壊せます
これはオブジェクト指向では推薦されないやり方で
この場合は SetName は const char* を返すのがいいのでしょうか?

Re:private修飾子へのアクセス手段

Posted: 2009年6月23日(火) 16:57
by ねこ
オブジェクト指向に沿っているかは自信がないのですが
参照用としてconst char*で返すのも有りだとは思いますが、setterの戻り値にあるのは若干違和感が・・・

基本的にsetter関数はvoidで定義するものじゃないでしょうか。
文字列の場合はgetter関数もvoidで、外に渡すのはあくまでコピーかなと。
参照が欲しい時は、明示的な関数を用意する。というのが僕の一意見です。
void A::SetName( char *name ){
	strcpy( m_name, name );
	printf( "%s にセットしました\n", m_name );
}
void A::GetName( char *name ){
	strcpy( name, m_name );
}
const char* A::GetNameP(){
	return m_name;
}

Re:private修飾子へのアクセス手段

Posted: 2009年6月23日(火) 17:46
by たかぎ
今回の場合に限っていえば、
class	A
{
private:
	std::string m_name;
public:
	void SetName(const char* name) { m_name = name; }
	void SetName(const std::string& name) { m_name = name; }

	void Show() const { std::cout << m_name << std::endl; }
	void Show(std::ostream& ostr) const { ostr << m_name << std::endl; }
};
といったところでしょうか?

Re:private修飾子へのアクセス手段

Posted: 2009年6月23日(火) 18:07
by dic
>ねこさん
ゲッターとセッターですか
わかりやすくていいですね

>たかぎさん
より高度化するとそのようになるんですね
参考になります

無題

Posted: 2009年7月05日(日) 00:19
by ちょたけ
たびたびですがゲームプログラミングの館の14の
コピー&コンパイルサンプルプログラムと実行結果とが合わないと思います
サンプルプログラムの方にback.bmpが描画されるような関数がありません

Re:無題

Posted: 2009年7月05日(日) 06:43
by Dixq (管理人)
あ、そうですね。
ミスのようです。
修正しますね。ご報告ありがとうございます。