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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

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

#1

投稿記事 by dic » 16年前

まず以下のコードを見て欲しいです
#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修飾子へのアクセス手段

#2

投稿記事 by ねこ » 16年前

オブジェクト指向に沿っているかは自信がないのですが
参照用として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修飾子へのアクセス手段

#3

投稿記事 by たかぎ » 16年前

今回の場合に限っていえば、
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; }
};
といったところでしょうか?

dic

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

#4

投稿記事 by dic » 16年前

>ねこさん
ゲッターとセッターですか
わかりやすくていいですね

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

ちょたけ

無題

#5

投稿記事 by ちょたけ » 16年前

たびたびですがゲームプログラミングの館の14の
コピー&コンパイルサンプルプログラムと実行結果とが合わないと思います
サンプルプログラムの方にback.bmpが描画されるような関数がありません

Dixq (管理人)

Re:無題

#6

投稿記事 by Dixq (管理人) » 16年前

あ、そうですね。
ミスのようです。
修正しますね。ご報告ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る