質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3043閲覧

C++でメンバ変数の値を別クラスでも共有したい

mushipan0929

総合スコア56

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/03/25 07:45

編集2020/03/25 09:58

前提・実現したいこと

現在、コマンドプロンプトで複数の.h/.cppファイルに分けた上で簡単なゲームを作ろうとしていますが
player.hで宣言した変数の値をmap.cppで上手く共有できずに困っております。
初期値は共有できますが一旦playerで変更して、別のクラスで共有すると初期値をコピーしてきてしまいます。
どうすれば常に別クラスでも共有できるでしょうか?

最終的にはTest1::set()内のtest.set_numでnumの数値を[1]にして
Test2::get()内のget_numで先ほど入れた[1]をTest2内のnumに代入したいです。

ソースコード

C++

1//Study.cpp 2#include "Test1.h" 3#include "Test2.h" 4 5Test1 test1; 6Test2 test2; 7 8int main() 9{ 10 test1.get(); 11 test1.set(); 12 test2.get(); 13 14 return 0; 15} 16 17//Test1.cpp 18#include "Test1.h" 19#include <iostream> 20 21using namespace std; 22 23void Test1::get() 24{ 25 int num = 0; 26 num = test2.get_num(); //numに123456789を代入 27 cout << "Test1_num = " << num << endl; 28} 29 30void Test1::set() 31{ 32 int num = 1; 33 test2.set_num(num); //numに1を代入 34 cout << "Test1_num = " << num << endl; 35} 36 37//Test1.h 38#pragma once 39#include "Test2.h" 40 41class Test1 42{ 43public: 44 void get(); 45 void set(); 46private: 47 Test2 test2; 48}; 49 50//Test2.cpp 51#include "Test2.h" 52#include <iostream> 53 54using namespace std; 55 56void Test2::get() 57{ 58 num = get_num(); //numに1を代入(出来ていない) 59 cout << "Test2_num = " << num << endl; 60} 61 62//Test2.h 63#pragma once 64 65class Test2 66{ 67public: 68 void get(); 69 int get_num() { return num; } 70 void set_num(int _num) { num = _num; } 71private: 72 int num = 123456789; 73};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/03/25 07:51

> 別のクラスで共有すると初期値をコピーしてきてしまいます 状況がわかりません. 今現在,どうやって「共有」しているのでしょうか?
mushipan0929

2020/03/25 08:12

分かりづらく申し訳ないです。Test1.hでpublicとして宣言した変数例)int num = 0;をTest2.cppでprintf(“%d”,test2.num);などで呼び出していますが、Test1の方でいくら違う数値を代入してもTest2の方は毎回初期値である「0」が出力されている状況です。
izmktr

2020/03/25 08:16

原因は、Test1で代入しているインスタンスとTest2で表示しようとしているTest1のインスタンスが違うからです といってもこの説明では多分わからないと思うので、実際にソースを提示してください
mushipan0929

2020/03/25 08:28

ご返信ありがとうございます。 ソースコードを追記いたしました。
stdio

2020/03/25 08:37 編集

アクセス権の問題ですね。 Test2::get()にてset_numを呼んで下さい。
fana

2020/03/25 09:38

提示ソースコードを見た感じ… いろんな事柄を網羅的にクリアする必要がありそうです.
mushipan0929

2020/03/25 09:49

>>stdio様 ご指摘通りTest2::get()内にset_numを呼び出ししましたが、この場合Test1::set()内のset_numの数値を上書きしてしまいますので私の実現したい事とずれてしまいます。 表現力不足によりお手数をかけてしまい申し訳ない。 また、「アクセス権」についても検索いたしましたがこれはpublic,privateなどの事を指しているのでしょうか? >>fana様 まだまだ未熟な上改善点が多いのですね... そもそも書き方から違うのでしょうか?
guest

回答2

0

ベストアンサー

関数の中のローカル変数は、関数に入ったとき領域が確保され、
関数から出るとき無くなります。

このコードで、プログラム終了時までずっと存在するのは test2.num だけです。
これにアクセスするのに、Test2 のメンバ関数からは num と書くだけでよく、
Test1 のメンバ関数からは test2.get_num と test2.set_num を使います。

C++

1#include <iostream> 2using namespace std; 3 4class Test2 { 5public: 6 void get(); 7 int get_num() { return num; } 8 void set_num(int _num) { num = _num; } 9private: 10 int num = 123456789; 11}; 12 13class Test1 { 14public: 15 void get(); 16 void set(); 17private: 18 Test2 test2; 19}; 20 21Test1 test1; 22Test2 test2; 23 24int main() 25{ 26 test1.get(); 27 test1.set(); 28 test2.get(); 29} 30 31void Test2::get() 32{ 33 num = get_num(); // get_num() で取得した test2.num の値を test2.num に代入 34 cout << "Test2.num = " << num << endl; 35} 36 37void Test1::get() 38{ 39 int num = 0; // Test1::get() のローカル変数 40 num = test2.get_num(); // local num に test2.num の値 123456789を代入 41 cout << "Test1::get の local num = " << num << endl; 42 // ここで Test1::get の local num は無くなる 43} 44 45void Test1::set() 46{ 47 int num = 1; // Test1::set() のローカル変数 48 test2.set_num(num); // test2.num に local num の値 1 を代入 49 cout << "Test1::set の local num = " << num << endl; 50 // ここで Test1::set の local num は無くなる 51}

追記
test2.set_num(num); のコメントを修正しました。

追記2
すみません。説明が不明確でした。

Test1 test1;
Test2 test2;
という宣言により、このプログラムのグローバル変数は
test1 と test2 の 2つだけです。

test1 の中には test2 がありその中に num があります。
test2 の中には num があります。

ということは、このプログラムのグローバル変数は
test1.test2.num と test2.num の 2つだけです。

main の test1.set(); で 1 になるのは、test1.test2.num です。
main の test2.get(); で表示するのは、test2.num で 123456789 です。

投稿2020/03/25 13:32

編集2020/03/30 06:27
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mushipan0929

2020/03/30 05:18

ご返答遅くなり申し訳ありません。 ご丁寧に分かりやすくコメントまで付けていただいて有難いです。 ですが何故Test1::set()内でtest2.numに"1"を代入しているにも関わらず test2::get()内でnumの数値を取り出すと123...が出てきてしまうのでしょうか? 確かにTest1::set()から外れるとTest1::set()内のローカル変数であるnumは消えてしまいます。 それと同時にTest2.numの中身も消えてしまうのでしょうか? これは違うソース、ヘッダーファイルだから起きてしまうものなのですか?
guest

0

まずインスタンスとはなにか

void foo(){ int a; a = 100; } void goo(){ int a; }

同じ変数aですが、fooでa=100としたからと言って、gooのaが100になったりしません
foo所属のaとgoo所属のaは名前が同じでも別のものだからです
この別物、というのをインスタンスが違うといいます

では、mainで使っているtest2とtest1の中で使っているtest2は同じものでしょうか?
mainはグローバル変数上のtest2を使っていますが、
test1のtest2はtest1が所有しているtest2で別物です

test2.get()ではなく、test1.test2.get()としてみれば、変数が変わっているのが確認できると思います

投稿2020/03/25 10:07

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/03/25 11:56

細かいことですが, > test1.test2.get() は,test2がprivateなので呼べないので,そこらへんの注意というか補足が要りそうに思います(質問者の状況を想像するに).
Zuishin

2020/03/26 22:47

これはインスタンスではなくスコープと言います。
mushipan0929

2020/03/30 05:59 編集

ご返答遅くなり申し訳ありません。 クラス名、オブジェクト名が同じならどこに書いても共通だと思っていました... 試しにtest2をpublicにするとTest2::get()で"1"を代入することが出来ました。 よくよく考えたら、オブジェクト名をprivateに入れる必要がありませんでした。 ご丁寧に教えていただきありがとうございました。
Zuishin

2020/03/30 05:47

間違った回答なので参考にしないほうがいいですよ。
mushipan0929

2020/03/30 06:06

鵜呑みにはせず、自分の方でももう少し調べていきます。 ローカル、グローバル変数の存在のみでスコープについて殆ど理解できていないことが分かりましたので...
izmktr

2020/03/30 07:43

>Zuishin 私ではなく回答者が役に立つようなメッセージを心がけましょう
Zuishin

2020/03/30 07:43

質問者の役に立つコメントをしました。
Zuishin

2020/03/30 07:44

あなたは質問者の役に立つ回答を心がけてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問