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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,260

ain4425

score 17

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
としています。


Person.exe: Person.obj Person_main.obj
    bcc32 -ePerson.exe Person.obj Person_main.obj

Person.obj: Person.cpp
    bcc32 -c Person.cpp
Person_main.obj: Person_main.cpp
    bcc32 -c Person_main.cpp

Person.obj: Person.h
Person_main.obj: Person.h
#include"Person.h"
#include<iostream>
#include<string>
using namespace std;


int main(){
    cout << "A~Dの評価を出力します\n" << endl;
    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),
    };//関連付け終了
        Person = new Person;
        int i;
    for(i = 0; i < 4; i++){//出力開始
         person[i].Show();
    }//出力終了

    string nameinput;
    cout << "A~Dを入力" << flush;
    getline(cin,nameinput);//getline(cin,変数)で変数の読み込み
    for(i = 0;i < 4;i++){
        if(person[i].getname() == nameinput){
            person[i].Show();
        }
    }
        delete person; //デストラクタ呼び出し
}
#include"person.h"
#include<iostream>
#include<cstdlib>
using namespace std;
#include<string>


void Person::Show(){//A~Dの名前と評価の表示
    cout << "名前:" << name << endl;
    cout << "第一問:" << q1  << endl;
    cout << "第二問:" << q2 << endl;
    cout << "第三問:" << q3 << endl;
      cout << "第四問:" << q4 << endl;

    cout << ""<< endl;
}//名前と評価の表示終了



Person::Person(){  //変数の初期化
    name = "初期化";
    q1 = 0;
    q2 = 0;
    q3 = 0;
      q4 = 0;
}//変数の初期化終了



Person::Person(string str, int q1_local, int q2_local, int q3_local, int q4_local){//名前に評価を代入
    name = str;
    q1 = q1_local;
    q2 = q2_local;
    q3 = q3_local;
      q4 = q4_local;
}//代入終了

//デストラクタの実装
Person::~Person(){}

string Person::getname(){//名前の取得
    return(name);
}//名前の取得終了
//ヘッダーファイルです

#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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/19 17: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 ***

    キャンセル

  • 2017/06/19 18:03

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

    キャンセル

  • 2017/06/19 18:32

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

    キャンセル

checkベストアンサー

0

とりあえずコンパイルエラーを解消するには:

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

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

さらに、ランタイムエラーについて:

  1. main関数のdelete person;を削除してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/19 18:33

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

    キャンセル

  • 2017/06/19 18:35

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

    キャンセル

  • 2017/06/19 19:04

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

    キャンセル

0

こんにちは。

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/19 17: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 ***

    キャンセル

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る