🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

Q&A

解決済

1回答

698閲覧

メンバ関数に代入されたはずなのにあとからそのメンバ関数をアクセサで呼び出すと初期値のままである理由が知りたい。

AmatsuhaShiki

総合スコア9

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

1グッド

0クリップ

投稿2019/11/18 18:12

編集2019/11/18 18:19

郵便配達の履歴を記録するプログラムを試作している途中に問題が発生。
試作途中のため作りが稚拙なのは御容赦いただけると幸いである。
まずは以下にソースコードを示す。

c++

1#include"iostream" 2#include"string" 3using namespace std; 4class Packet{ 5 string name,sendP,relayP,receiveP; 6public: 7 Packet(string p1,string p2,string p3,string p4):name(p1),sendP(p2),relayP(p3),receiveP(p4){}; 8 Packet():name("noname"),sendP("nowork"),relayP("nowork"),receiveP("nowork"){}; 9 void send(Packet a,Packet b,string p){ 10 cout<<"("<<name<<")->"<<a.getName()<<"に"<<b.getName()<<"へ内容「"<<p<<"」の配達を依頼"<<endl; 11 a.relay(b,name,p); 12 sendP=p; 13 } 14 void relay(Packet c,string postal,string p){ 15 cout<<"("<<name<<")->"<<postal<<"から配達受領、"<<c.getName()<<"に「"<<p<<"」を転送"<<endl; 16 c.receive(name,p); 17 relayP=p; 18 } 19 void receive(string postal,string p){ 20 cout<<"("<<name<<")->"<<postal<<"から「"<<p<<"」を受領"<<endl; 21 receiveP=p; 22 } 23 void work()const{ 24 cout<<"("<<name<<")->"<<"配達依頼「"<<sendP<<"」、転送「"<<relayP<<"」、受領「"<<receiveP<<"」"<<endl; 25 } 26 string getName(){return name;} 27 void setName(string n){name=n;} 28}; 29int main(){ 30 Packet k1("k1","null","null","null"); 31 Packet k2("k2","null","null","null"); 32 Packet k3("k3","null","null","null"); 33 k1.send(k2,k3,"Apple"); 34 cout<<"以下配達明細"<<endl; 35 k1.work(); 36 k2.work(); 37 k3.work(); 38 return 0; 39} 40

次に実行結果を示す。

c++

1(k1)->k2にk3へ内容「Apple」の配達を依頼 2(k2)->k1から配達受領、k3に「Apple」を転送 3(k3)->k2から「Apple」を受領 4以下配達明細 5(k1)->配達依頼「Apple」、転送「null」、受領「null」 6(k2)->配達依頼「null」、転送「null」、受領「null」 7(k3)->配達依頼「null」、転送「null」、受領「null」

本来は以下のようになってほしい。

c++

1(k1)->k2にk3へ内容「Apple」の配達を依頼 2(k2)->k1から配達受領、k3に「Apple」を転送 3(k3)->k2から「Apple」を受領 4以下配達明細 5(k1)->配達依頼「Apple」、転送「null」、受領「null」 6(k2)->配達依頼「null」、転送「Apple」、受領「null」 7(k3)->配達依頼「null」、転送「null」、受領「Apple」

代入はソースコードの17,21行目でされているはずで、実際そこにcoutを入れてそれぞれの中身を表示させると代入できていることが確認できた。
しかし、配達明細の部分でアクセサを用いて中身を呼び出すと初期値であるnullのままとなっている。
このような挙動となる理由、原因が知りたいと存ず。
利用環境により変わるものではないと考えるので利用環境明記略。

初め、ネットでの検索を試みたがどのように検索ワードを入れたら答えにたどり着くかが思い浮かばなかった(いくつかは試したが望む答えが得られなかった)ため、何か良い案をご存じの方は教えていただけると幸いである。

swordone👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

C++は特に指定しなければ、引数は全て値渡しになりますので、実引数が仮引数へコピーされます。
結果、仮引数を修正しても実引数へ反映されません。
参照を使えば意図通りに動作する筈です。

C++

1#include"iostream" 2#include"string" 3using namespace std; 4class Packet{ 5 string name,sendP,relayP,receiveP; 6public: 7 Packet(string p1,string p2,string p3,string p4):name(p1),sendP(p2),relayP(p3),receiveP(p4){}; 8 Packet():name("noname"),sendP("nowork"),relayP("nowork"),receiveP("nowork"){}; 9 void send(Packet& a,Packet& b,string p){ 10 cout<<"("<<name<<")->"<<a.getName()<<"に"<<b.getName()<<"へ内容「"<<p<<"」の配達を依頼"<<endl; 11 a.relay(b,name,p); 12 sendP=p; 13 } 14 void relay(Packet& c,string postal,string p){ 15 cout<<"("<<name<<")->"<<postal<<"から配達受領、"<<c.getName()<<"に「"<<p<<"」を転送"<<endl; 16 c.receive(name,p); 17 relayP=p; 18 } 19 void receive(string postal,string p){ 20 cout<<"("<<name<<")->"<<postal<<"から「"<<p<<"」を受領"<<endl; 21 receiveP=p; 22 } 23 void work()const{ 24 cout<<"("<<name<<")->"<<"配達依頼「"<<sendP<<"」、転送「"<<relayP<<"」、受領「"<<receiveP<<"」"<<endl; 25 } 26 string getName(){return name;} 27 void setName(string n){name=n;} 28}; 29int main(){ 30 Packet k1("k1","null","null","null"); 31 Packet k2("k2","null","null","null"); 32 Packet k3("k3","null","null","null"); 33 k1.send(k2,k3,"Apple"); 34 cout<<"以下配達明細"<<endl; 35 k1.work(); 36 k2.work(); 37 k3.work(); 38 return 0; 39}

wandbox

投稿2019/11/18 18:30

Chironian

総合スコア23272

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

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

AmatsuhaShiki

2019/11/18 19:00

有難う御座いました。 仮引数と実引数という概念について知ることができ大変うれしく存じます。 問題は解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問