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

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

新規登録して質問してみよう
ただいま回答率
85.48%
makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

Q&A

解決済

3回答

3790閲覧

c++でのプログラム分割でエラーが出てしまいます

ain4425

総合スコア19

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

0グッド

1クリップ

投稿2017/06/19 08:31

編集2017/06/19 09:15

A,B,C,Dの4人がいて、彼らがある4つの問題を解いた点数(5点満点)をまず関連付けます。プログラムを実行させると、まずA~Dを入力するようにいわれます。どれかを打ったら、その人がとった点数が4つ並べて以下のように表示されます。


※Cと打った場合

C
名前:C
第一問:4
第二問:1
第三問:5
第四問:2


以上のようなプログラムを組みたいです。分割しない状態ではうまくいったのですが、分割したらうまくいかなくなってしまいました。エラーは以下です。コンパイラはborlandを使用しました。
以上宜しくお願いします

person.cpp:
エラー E2303 person.h 5: 型名が必要
エラー E2139 person.h 5: 宣言に ; がない
エラー E2293 person.h 14: ) が必要
エラー E2303 person.h 15: 型名が必要
エラー E2238 person.h 15: 'Person::string' の宣言が複数見つかった
エラー E2344 person.h 5: 一つ前の 'Person::string' の定義位置
エラー E2139 person.h 15: 宣言に ; がない
エラー E2380 person.cpp 9: 文字列または文字定数が閉じていない(関数 Person::Show() )
エラー E2379 person.cpp 10: ステートメントにセミコロン(;)がない(関数 Person::Show() )
エラー E2380 person.cpp 10: 文字列または文字定数が閉じていない(関数 Person::Show() )

エラー E2380 person.cpp 11: 文字列または文字定数が閉じていない(関数 Person::Show() )
エラー E2380 person.cpp 12: 文字列または文字定数が閉じていない(関数 Person::Show() )
エラー E2380 person.cpp 13: 文字列または文字定数が閉じていない(関数 Person::Show() )
エラー E2451 person.cpp 21: 未定義のシンボル name(関数 Person::Person() )
エラー E2380 person.cpp 21: 文字列または文字定数が閉じていない(関数 Person::Person() )
エラー E2379 person.cpp 22: ステートメントにセミコロン(;)がない(関数 Person::Person() )
エラー E2147 person.cpp 30: 引数宣言は 'string' で始められない
エラー E2316 person.cpp 30: 'Person::Person(int,int,int,int,int)' は 'Person' のメンバーではない
エラー E2316 person.cpp 41: 'Person::getname()' は 'Person' のメンバーではない
*** 19 errors in Compile ***


以下、プログラムを載せます。
上から、
①makefile
②person_main.cpp
③person.cpp
④Person.h
としています。


makefile

1 2Person.exe: Person.obj Person_main.obj 3 bcc32 -ePerson.exe Person.obj Person_main.obj 4 5Person.obj: Person.cpp 6 bcc32 -c Person.cpp 7Person_main.obj: Person_main.cpp 8 bcc32 -c Person_main.cpp 9 10Person.obj: Person.h 11Person_main.obj: Person.h 12 13

c++

1 2#include"Person.h" 3#include<iostream> 4#include<string> 5using namespace std; 6 7 8int main(){ 9 cout << "A~Dの評価を出力します\n" << endl; 10 Person person[4]={//4人の評価を関連付け 11 Person("A",5,3,4,3), 12 Person("B",2,5,2,3), 13 Person("C",4,1,5,2), 14 Person("D",2,4,5,1), 15 };//関連付け終了 16 Person = new Person; 17 int i; 18 for(i = 0; i < 4; i++){//出力開始 19 person[i].Show(); 20 }//出力終了 21 22 string nameinput; 23 cout << "A~Dを入力" << flush; 24 getline(cin,nameinput);//getline(cin,変数)で変数の読み込み 25 for(i = 0;i < 4;i++){ 26 if(person[i].getname() == nameinput){ 27 person[i].Show(); 28 } 29 } 30 delete person; //デストラクタ呼び出し 31} 32 33

C++

1 2#include"person.h" 3#include<iostream> 4#include<cstdlib> 5using namespace std; 6#include<string> 7 8 9void Person::Show(){//A~Dの名前と評価の表示 10 cout << "名前:" << name << endl; 11 cout << "第一問:" << q1 << endl; 12 cout << "第二問:" << q2 << endl; 13 cout << "第三問:" << q3 << endl; 14 cout << "第四問:" << q4 << endl; 15 16 cout << ""<< endl; 17}//名前と評価の表示終了 18 19 20 21Person::Person(){ //変数の初期化 22 name = "初期化"; 23 q1 = 0; 24 q2 = 0; 25 q3 = 0; 26 q4 = 0; 27}//変数の初期化終了 28 29 30 31Person::Person(string str, int q1_local, int q2_local, int q3_local, int q4_local){//名前に評価を代入 32 name = str; 33 q1 = q1_local; 34 q2 = q2_local; 35 q3 = q3_local; 36 q4 = q4_local; 37}//代入終了 38 39//デストラクタの実装 40Person::~Person(){} 41 42string Person::getname(){//名前の取得 43 return(name); 44}//名前の取得終了 45 46
//ヘッダーファイルです #ifndef PERSON_H_INCLUDED_ #define PERSON_H_INCLUDED_ #include<string> using namespace std; class Person{ string name; int q1; int q2; int q3; int q4; public: void Show();//名前と評価の表示 //コンストラクタ Person();//名前の設定→初期化 Person(string str, int q1_local, int q2_local, int q3_local, int q4_local);//長さ取得、代入 string getname();//名前の取得(stringのメンバ) ~Person(); }; #endif

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

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

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

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

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

guest

回答3

0

person.hの中でstd::stringを使っているので、ヘッダ内に#include<string>using namespace std;を入れる必要があります。

なお、今回のような外部で使わないヘッダならいいのですが、そうでないならusingの強制は問題となりかねませんので、std::stringと略さずに書きましょう。

投稿2017/06/19 08:45

maisumakun

総合スコア145183

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

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

ain4425

2017/06/19 08:58

usingの件、このようなものだと覚えてしまっていたので、とても参考になりました。 エラーがまだ残っているのですが、ご指摘いただけると幸いです person.cpp: エラー E2380 person.cpp 9: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2379 person.cpp 10: ステートメントにセミコロン(;)がない(関数 Person::Show() ) エラー E2380 person.cpp 10: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 11: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 12: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 13: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 21: 文字列または文字定数が閉じていない(関数 Person::Person() ) エラー E2379 person.cpp 22: ステートメントにセミコロン(;)がない(関数 Person::Person() ) エラー E2316 person.cpp 30: 'Person::Person(string,int,int,int,int)' は 'Person' のメンバーではない *** 9 errors in Compile ***
maisumakun

2017/06/19 09:03

コンパイラの想定する日本語文字コードとソースの文字コードがずれているとか、そういう問題なような気もします。
ain4425

2017/06/19 09:32

UTF-8で読み込みなおしましたがコンパイルできません、、 コード自体は大丈夫ということでしょうか?
guest

0

ベストアンサー

とりあえずコンパイルエラーを解消するには:
0. Person.hにコンストラクタの誤植があります。PersonvPersonにしてください。
0. main関数におかしな文があります。Person = new Personを削除してください。
0. ヘッダファイルの表記ゆれがあります。Person.hperson.hに統一してください。
0. ヘッダファイルはstring型を知りません。#include<string>を追加してください。

Visual Studioでは、これでコンパイルは通りました。

さらに、ランタイムエラーについて:
0. main関数のdelete person;を削除してください。

投稿2017/06/19 08:50

編集2017/06/19 09:37
LouiS0616

総合スコア35660

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

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

ain4425

2017/06/19 09:18

回答ありがとうございます! 1と4と3を改善しました。2についてなのですが、コンストラクタを呼び出したつもりでした。 コンストラクタの呼び出しはこれでは間違っていますでしょうか?
LouiS0616

2017/06/19 09:20

Person person[4]={//4人の評価を関連付け Person("A",5,3,4,3), Person("B",2,5,2,3), Person("C",4,1,5,2), Person("D",2,4,5,1), };//関連付け終了 この時点でコンストラクタは呼び出されています。
ain4425

2017/06/19 09:26

毎度すみません! すでにコンストラクタは呼び出されているということで、 Person = new Person; を消し、 delete person; を消してみましたがコンパイルが通りません。 delete personを消した場合、どこがデストラクタの働きをするのでしょうか
LouiS0616

2017/06/19 09:33

スコープ外に移動しようとするときにデストラクタが働きます。 newとdeleteを使うときは、明示的に変数の生存期間を指定してやる必要があります。
LouiS0616

2017/06/19 09:35

私の環境ではコンパイルが通ったのですが... 環境依存らしいコードも見当たらないので、どこか修正を勘違いされているのかもしれません。 回答の誤解を生みそうな個所を修正しておきます。
ain4425

2017/06/19 10:04

ありがとうございます。もう少し考えてみます
guest

0

こんにちは。

person.hの中でstd::stringを使っています。std::stringを使う前に<string>をンクルードする必要が有ります。


【蛇足ですが】
ヘッダ・ファイルでusing 名前空間;をするのは弊害が少なくありません。
名前空間に入れることで他の同じ識別子を持つライブラリとの共存が可能になります。
しかし、ヘッダでusing 名前空間;することで、当該ヘッダを使う人全てに、「他の同じ識別子を持つライブラリとの共存」を断念させることになるためです。

個人的には、タイプするのは面倒ですがstd::stringといちいち書いた方がトータルでは生産性が上がるように感じます。

投稿2017/06/19 08:48

Chironian

総合スコア23272

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

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

ain4425

2017/06/19 08:57

ありがとうございます。 まだ学習してすぐなので、参考書通りにusingを使ってしまいました。今後参考にさせていただきます。 ヘッダーに追加したところ、エラーが半分ほどになりました! あと、残りのエラーなのですが、ぱっと見でどこにもエラーが見当たりません。 以下、どこが違うのかご指摘いただきたいです person.cpp: エラー E2380 person.cpp 9: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2379 person.cpp 10: ステートメントにセミコロン(;)がない(関数 Person::Show() ) エラー E2380 person.cpp 10: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 11: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 12: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 13: 文字列または文字定数が閉じていない(関数 Person::Show() ) エラー E2380 person.cpp 21: 文字列または文字定数が閉じていない(関数 Person::Person() ) エラー E2379 person.cpp 22: ステートメントにセミコロン(;)がない(関数 Person::Person() ) エラー E2316 person.cpp 30: 'Person::Person(string,int,int,int,int)' は 'Person' のメンバーではない *** 9 errors in Compile ***
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問