フレンドクラスからxの値が変更できない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
遊び人
記事: 42
登録日時: 6年前

フレンドクラスからxの値が変更できない

#1

投稿記事 by 遊び人 » 6年前

以下のプログラムにて、classAのフレンドクラスであるclassBはclassAのxを参照することはできるのですが、
xの値を変更することができません。
これは元々フレンドクラスから値を変更することができないのか、
何か記述忘れがあるのか、
それともclassBはまだ完全にclassAと友達になれていないのか、
教えてください。

OS:Windows10 コンパイラ:Visal Studio 2017

コード:

 
#include <iostream>
using namespace std;

class A {
private:
	int x;
public:
	A() : x(10) { }
	void show_x() { cout << x << endl; }
	void change_x(int num) { x = num; }

	friend class B;
};

class B {
public:
	void change_Ax(A name, int num) { name.x = num; }
	void show_Ax(A name) { cout << name.x << endl; }
};

int main()
{
	A test_a;
	B test_b;

	test_a.show_x();
	test_b.change_Ax(test_a, 114514);
	test_a.show_x();
	test_a.change_x(1919);
	test_b.show_Ax(test_a);

	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: フレンドクラスからxの値が変更できない

#2

投稿記事 by みけCAT » 6年前

xの値を変更することはできていますが、変更しているのはchange_Ax関数にローカルな引数なので、変更はchange_Ax関数から戻ると保存されません。
呼び出し元のクラスAのインスタンスに手を加えたい場合は、change_Axの引数のAの代わりにA&を用い、参照にするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

遊び人
記事: 42
登録日時: 6年前

Re: フレンドクラスからxの値が変更できない

#3

投稿記事 by 遊び人 » 6年前

change_Axの引数を参照渡しにすることで値を変更することができました。ありがとうございます。

コード:

 
void change_Ax(A &name, int num) { name.x = num; }
しかし「猫でもわかるC++プログラミング」という書籍のP299では、参照渡しではなく値渡しでxの値を変更できると書いてあります。これはどういう意味でしょうか?

コード:

 
class A {
	int x;
public:
	A() : x(10) { }
	friend class B;
};

class B {
public:
        // フレンドクラスなので、xの値を変更できる
	void change_x(A a) { a.x = 100; }
};

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: フレンドクラスからxの値が変更できない

#4

投稿記事 by へにっくす » 6年前

> どういう意味
friendを外してコンパイルしてみるといい。
コンパイルエラーになるはず。
friendをつけるとコンパイルが通り、かつその関数内でよそのクラスのprivate変数にアクセスできる。
それだけの違い。

参照渡しでも値渡しでも、private変数にアクセスできているのは同じだ。
違いは、呼び出し元に返るかだけでこの点はfriend関係ない。

その本には、「参照渡しではなく値渡しでxの値を変更できる」とはっきり文章で書いてあるのか?
はっきり書いてあるのなら、それは間違い。
No.3に掲示されたソースのコメントにはそう書いてないよね。
written by へにっくす

遊び人
記事: 42
登録日時: 6年前

Re: フレンドクラスからxの値が変更できない

#5

投稿記事 by 遊び人 » 6年前

皆様分かりやすい説明をありがとうございます。
フレンドクラスでも変数の寿命が適応するのですね・・・
とても良い勉強になりました。

返信

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