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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

1回答

1712閲覧

C++ メンバ関数を呼び出し、アウトプット

amareno

総合スコア20

C++

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

0グッド

0クリップ

投稿2018/10/10 21:26

前提・実現したいこと

現在c++の問題を解いています。

Person

  • name : string
  • Person(name:string):
  • getName():string
  • setName(n:string):void

Publication

  • count:static int
  • pubNumber:int
  • title:string
  • borrower:Person
  • Publication(title:string):
  • getBorrower():Person
  • setBorrower(p:Person):void
  • display():void

上記のUMLのclass diagramを使用して下記のoutputを得たいです。

Publication Number Title Borrower Name


1 War and Peace Lady Gaga
2 Object-Oriented Programming Albert Einstein
3 Grapes of Wrath Muhammed Ali

問題文に、Publicationのコンストラクタでは、countを増加させて、それを使用してpubNumberの値を設定する。display関数を用いて上記のoutputを表示すると書かれています。

該当のソースコード

C++

1#include <iostream> 2#include <string> 3#include <iomanip> 4 5using namespace std; 6 7class Person { 8private: 9 string name; 10 11public: 12 13 14 Person (){ 15 {name = "Lady Gaga"}, 16 {"Albert Einstein"}, 17 {"Muhammed Ali"}; 18 } 19 20 Person (string name) { 21 setName(" "); 22 } 23 24 Person(const string& pName) { 25 setName(pName); 26 } 27 28 void setName (const string& pName) { 29 name = pName; 30 } 31 32 string getName() const { 33 return name; 34 } 35}; 36 37 38 39class Publication { 40private: 41 static int count; 42 int pubNumber; 43 string title; 44 Person loaner; 45 //Person(); 46 47 48public: 49 Publication() { 50 51 {title = "War and Peace"}, 52 {"Object-Oriented Programming"}, 53 {"Grapes of Wrath"}; 54 55 } 56 57 58 59 60/* 61 Publication (int pub) { 62 pubNumber = pub; count++; 63 } 64 ここの部分これで良いのでしょうか? 65 int getPubNumber() const { 66 return pubNumber; 67 } 68*/ 69 70 71 72 73 74 Publication (string title) { 75 this->title = title; 76 } 77 78 79 80 void setBorrower(Person p) { 81 this->loaner = p; 82 } 83 84 Person getBorrower() const { 85 return loaner; 86 } 87 88 void display(); 89 90}; 91 92int Publication::count = 0; 93 94int main() { 95 96 //Person person1("Lady gaga"); 97 98 //person1. 99 100 cout << "Publication Number" << setw(5) << "Title" << setw(15) << "Borrower Name" << endl; 101 102 cout << "------------------" << setw(5) << "-----" << setw(15) << "-------------" <<endl; 103 104 return 0; 105} 106

display関数内にどのようなコードを書いてそれをどの様にmain関数でcoutするのか教えて頂けると嬉しいです。

Person (){
{name = "Lady Gaga"},
{"Albert Einstein"},
{"Muhammed Ali"};
}

Publication() {

{title = "War and Peace"}, {"Object-Oriented Programming"}, {"Grapes of Wrath"}; }

また、上記の部分、
error: expected ';' after expression
error: expected expression
とエラーが出るのでそれも教えていただきたいです。
ありがとうございます。よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず、エラーとワーニングは取ってあります。d^^
main()をいじった

c++

1#include <iostream> 2#include <string> 3#include <iomanip> 4 5using namespace std; 6 7class Person { 8private: 9 string name; 10 11public: 12 13 14 Person ():name("Lady Gaga""Albert Einstein""Muhammed Ali"){ 15// {name = "Lady Gaga"}, 16// {"Albert Einstein"}, 17// {"Muhammed Ali"}; 18 } 19 20 Person (string n) { 21 setName(n); 22 } 23 24 Person(const string& pName) { 25 setName(pName); 26 } 27 28 void setName (const string& pName) { 29 name = pName; 30 } 31 32 string getName() const { 33 return name; 34 } 35}; 36 37 38 39class Publication { 40private: 41 static int count; 42 int pubNumber; 43 string title; 44 Person loaner; 45 //Person(); 46 47 48public: 49 Publication():pubNumber(0),title("War and Peace""Object-Oriented Programming""Grapes of Wrath"){ 50 51 // {title = "War and Peace"}, 52 // {"Object-Oriented Programming"}, 53 // {"Grapes of Wrath"}; 54 55 } 56 57 58 59 60/* 61 Publication (int pub) { 62 pubNumber = pub; count++; 63 } 64 ここの部分これで良いのでしょうか? 65 int getPubNumber() const { 66 return pubNumber; 67 } 68*/ 69 70 71 72 73 74 Publication (string &t) { 75 title = t; 76 } 77 78 79 80 void setBorrower(Person p) { 81 loaner = p; 82 } 83 84 Person getBorrower() const { 85 return loaner; 86 } 87 88 void display(); 89 90}; 91 92int Publication::count = 0; 93 94int main() { 95 96 //Person person1("Lady gaga"); 97 98 //person1. 99 100 cout << "Publication Number" << setw(5) << "Title" << setw(15) << "Borrower Name" << endl; 101 102 cout << "------------------" << setw(5) << "-----" << setw(15) << "-------------" <<endl; 103 104 return 0; 105} 106

「追記」

main関数でcoutするのか

Publicationの数をカウントするならコンストラクタでカウントアップ、デストラクタでカウントダウンです。main()では参照するだけですね。
//

下記の様なコードは違いますでしょうか?

Publication (int pub) {
pubNumber = pub; count++;
}

int getPubNumber() const {
return pubNumber;
}
ちょっとはしょちゃいましたが、わかりますか?
コンストラクタでの共通部分はprivate関数にしてコンストラクタから呼び出したほうが分かりやすいです。

c++

1#include <iostream> 2#include <string> 3#include <iomanip> 4 5using namespace std; 6 7class Person 8{ 9 private: 10 string name; 11 12 public: 13 Person(){} 14 15 Person(string n) { setName(n); } 16 17 Person(const string &pName) { setName(pName); } 18 19 void setName(const string &pName) { name = pName; } 20 21 string getName() const { return name; } 22}; 23 24class Publication 25{ 26 private: 27 static int count; 28 int pubNumber; 29 string title; 30 Person loaner; 31 // Person(); 32 33 public: 34 // コンストラクタ 35 Publication() 36 : pubNumber(0) 37 { 38 count++; 39 } 40 41 Publication(int pub) 42 { 43 pubNumber = pub; 44 count++; 45 } 46 Publication(const string &t) 47 { 48 title = t; 49 count++; 50 } 51 // デストラクタ 52 ~Publication() { count--; } 53 // 54 int getPubNumber() const { return pubNumber; } 55 56 void setBorrower(Person p) { loaner = p; } 57 58 Person getBorrower() const { return loaner; } 59 60 void display(); 61}; 62 63int Publication::count = 0; 64 65int main() 66{ 67 Publication pr[3]= 68 { 69 string("War and Peace"), 70 string("Object-Oriented"), 71 string("Programming") 72 }; 73 // 74 Person person; 75 // 76 person.setName("Lady gaga"); 77 pr[0].setBorrower(person); 78 // 79 person.setName("Albert Einstein"); 80 pr[1].setBorrower(person); 81 // 82 person.setName("Muhammed Ali"); 83 pr[2].setBorrower(person); 84 85 cout << "Publication Number" << setw(5) << "Title" << setw(15) 86 << "Borrower Name" << endl; 87 88 cout << "------------------" << setw(5) << "-----" << setw(15) 89 << "-------------" << endl; 90 91 for( int i= 0; i < 3; i++ ){ 92 pr[i].display(); 93 } 94 95 return 0; 96} 97 98void Publication::display() 99{ 100 cout << title << " " << loaner.getName() << endl << endl; 101// cout << "count:" << count << endl; 102}

投稿2018/10/10 21:50

編集2018/10/11 09:42
cateye

総合スコア6851

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

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

amareno

2018/10/10 22:24

回答ありがとうございます。 すいません、私のコンストラクタに対する理解力がまだ乏しいのでどの様にコンストラクタでカウントアップ、デストラクタでカウントダウンをしたら良いのか分かりません。 下記の様なコードは違いますでしょうか? Publication (int pub) { pubNumber = pub; count++; } int getPubNumber() const { return pubNumber; } 教えて頂けるとありがたいです。
cateye

2018/10/11 00:18

先にデストラクタですが、引数や戻り値のない関数でオブジェクト(クラス)が破棄される時(宣言した関数を抜けるとき、new→deleteなど)に呼ばれますd^^通常は所得したメモリの解放などの終了処理を行います。 次にコンストラクタですが、こちらはオブジェクト(クラス)が生成されるときに呼ばれます。引数がないコンストラクタは、デフォルトコンストラクタです。この辺は、http://www.02.246.ne.jp/~torutk/cxx/constructor/index.html に詳しいですd^^ >下記の様なコードは違いますでしょうか? については回答に加筆します。
cateye

2018/10/11 00:54

で、見てて気になったのですが、コンストラクタはクラス生成時に引数に対応した物が1度だけ呼ばれますが・・・大丈夫ですか?
amareno

2018/10/11 04:19

詳しい回答ありがとうございます。 コンストラクタはクラス生成時に引数に対応した物が1度だけ呼ばれますが・・・大丈夫ですか? Publication Number Title Borrower Name ----------------- ------ ---------------------- 1 War and Peace Lady Gaga 2 Object-Oriented Programming Albert Einstein 3 Grapes of Wrath Muhammed Ali では下記のコードでは上記の様なアウトプットは得られずこのアウトプットになるということでしょうか? War and PeaceObject-Oriented ProgrammingGrapes of Wrath private: static int count; int pubNumber; string title; Person loaner; public: // コンストラクタ Publication() : pubNumber(0), title("War and Peace" "Object-Oriented Programming" "Grapes of Wrath") { count++; }
cateye

2018/10/11 04:45 編集

えっと、ちょっとmain()いじってみたので・・・上記リンク“main()をいじった”を見て下さい。で、この場合は Publication(const string &t)のみが呼ばれます。なので、設定するデータがあればパラメータを増やすか、別関数(いわゆるセッター)にしましょう。クラスが3つ作られるので、Personも3個有ります。したがって、各クラスに設定する値が(個別に)必要になります。
amareno

2018/10/11 04:58

あ、すいません、ちょっとmain()いじってみたのところクリックできるの気がつきませんでした。 ありがとうございます。参考にしてコードを書き進めていきます。
cateye

2018/10/11 05:35 編集

細かい事には触れていませんが、表示に関して言えば、一行毎にクラスが必要になると思います。 クラスの考え方:RPGでいえば、ギルドクラスがあってギルドに属するプレヤークラスがあって、NPCクラスやモンスタークラスあってw・・・その各々に個別の属性(スレイヤー、ウイザードとかスライム、ドラゴンとかw)があるって事かな?
amareno

2018/10/11 07:58

すいません、間違ってると思うのですが下記の様な感じでしょうか? class Person { private: string name1; public: Person() : name1("Lady Gaga") { } Person(string n) { setName1(n); } Person(const string &pName) { setName1(pName); } void setName1(const string &pName) { name1 = pName; } string getName1() const { return name1; } }; class Person { private: string name2; public: Person() : name2("Albert Einstein") { } Person(string n) { setName2(n); } Person(const string &pName) { setName2(pName); } void setName2(const string &pName) { name2 = pName; } string getName2() const { return name2; } }; public: Person() : name3("Muhammed Ali") { } Person(string n) { setName3(n); } Person(const string &pName) { setName3(pName); } void setName3(const string &pName) { name3 = pName; } string getName3() const { return name3; } };
cateye

2018/10/11 08:21

名前の初期化が必要なら、PersonのコンストラクタPerson()に名前を与えてそれで初期化すればOKです。 例えば、Person(const string &name) : name1(name) {} で、今回は他のクラスにPersonが含まれるので、void setName1(const string &pName)を使ったほうが楽でしょう、あと、先程も言いましたが、Publicationが複数作られる場合はPersonもその数だけできます、従って、Publication p; と宣言すれば、p.loanerで参照可能です。ただ、外部からはloanerは不可視なので、なんだかの手段(setBorrowerのような)が必要です。そっくりコピーするのが嫌なら参照渡しでもOKです。
cateye

2018/10/11 09:41 編集

回答のソース修正しましたv^^ 結構我流なので、あとは自力で^^; Publication NumberTitle Borrower Name ----------------------- ------------- War and Peace Lady gaga Object-Oriented Albert Einstein Programming Muhammed Ali ※不要なもの(関数など)は削除しましょうd^^・・・あとで、なんだっけ? ってならないようにw
amareno

2018/10/11 20:30

Publication(const string &t) { title = t; pubNumber = count + 1; count++; } 上記のコードで 1 2 3 のアウトプットが出来ました。 これで完成です。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問