合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: 遊び人
[URL]
ぴよぴよ(920 ポイント)
Date: 2017年10月03日(火) 23:10
No: 1
(OFFLINE)

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

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

OS:Windows10 コンパイラ:Visal Studio 2017
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
#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;
}

Name: みけCAT
[URL]
伝説なるハッカー(683,511 ポイント)
Date: 2017年10月03日(火) 23:58
No: 2
(OFFLINE)

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

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

Name: 遊び人
[URL]
ぴよぴよ(920 ポイント)
Date: 2017年10月04日(水) 01:06
No: 3
(OFFLINE)

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

change_Axの引数を参照渡しにすることで値を変更することができました。ありがとうございます。
コード[C++]: 全て選択
1
2
 
void change_Ax(A &name, int num) { name.x = num; }

しかし「猫でもわかるC++プログラミング」という書籍のP299では、参照渡しではなく値渡しでxの値を変更できると書いてあります。これはどういう意味でしょうか?
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
 
class A {
    int x;
public:
    A() : x(10) { }
    friend class B;
};
 
class B {
public:
        // フレンドクラスなので、xの値を変更できる
    void change_x(A a) { a.x = 100; }
};

Name: へにっくす
[URL]
熟練のプログラマー(61,578 ポイント)
Date: 2017年10月04日(水) 05:04
No: 4
(OFFLINE)

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

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

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

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

Name: 遊び人
[URL]
ぴよぴよ(920 ポイント)
Date: 2017年10月04日(水) 08:17
No: 5
(OFFLINE)

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

[解決!]

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[19人]