1. ホーム
  2. c++

[解決済み】"...... "のプロトタイプがクラス"...... "内のどれとも一致しない。

2022-02-13 08:35:18

質問

c++のプログラミングを始めて、クラスとオブジェクトの概念を学んでいます。そこで、ウェブ上で練習できるような練習問題を探してみました。メイン、ヘッダー、コンストラクタの各ファイルを1つの長いファイルにまとめず、別々にするのが良い方法だと書いてありました。

私は以下のコードを3つの別々のファイルに分割しようとしています。

// Exercises: Classes
// Exercise 3


// Exercises: Classes
// Exercise 3


#include <iostream>
using namespace std;

class Student{

public:
char *name;
int mark1;int mark2;

Student(char* na, int ma1,int ma2){
name=na;mark1=ma1;mark2=ma2;
}



int calc_media(){return (mark1+mark2)/2;}

    void disp(){
    cout << "Student:" << name << " \n media:"<< calc_media() <<"\n";
    }

};

int main(){

    char* nam;int m1,m2;

    cout << "Enter name:";
    cin>> nam;
    cout << "Enter marks of two subjects:";
    cin>> m1;
    cin>> m2;
    Student student1(nam,m1,m2);
    student1.disp();

    return 0;
}

を以下のファイルにコピーしてください。

main.cpp。

#include <iostream>
#include <string>
#include "student_example.h"
using namespace std;

int main()
{
   int marc1,marc2;
   char nam;

   cout<<"Please enter the name of the student:  ";
   cin>>nam;
   cout<<"Please enter the two grades of the student"<<"\n grade one:";
   cin>>marc1;
   cout<<"Grade two";
   cin>>marc2;

   student_Example student1;
   student1.disp();

   return 0;
}

ヘッダーファイル (student_Example.h)

#ifndef STUDENT_EXAMPLE_H
#define STUDENT_EXAMPLE_H
#include <iostream>
#include <string>

class student_Example
{
    public:
        char name;
        int mark1, mark2;

        int calc_media(){
           return (mark1+mark2/2);
           }

void disp(){
           std::cout<< " The student named: "<< name<< "\n has an average score equal to: " << calc_media()<<"\n";
        }
};

そしてコンストラクタ。

#include <iostream>
#include <string>

#include "student_Example.h"

student_Example::student_Example(char nam, int marc1, int marc2)
{
    name=nam;
    mark1=marc1;
    mark2=maec2;

}

エラーが発生しました。

"error: prototype for **'student_Example::student_Example(char, int, int)' does not match any class 'student_Example'**

ここで何が起こっているのか、何かアドバイスがあれば教えてください。よろしくお願いします :)

解決方法は?

ヘッダーファイルで class student_Example はコンストラクタを約束しません。(そして欠落しているようで #endif )

#ifndef STUDENT_EXAMPLE_H
#define STUDENT_EXAMPLE_H
#include <iostream>
#include <string>

class student_Example
{
    public:
        student_Example(char nam, int marc1, int marc2); //<-- as pointed out in the error
        char name;
        int mark1, mark2;

        int calc_media(){
           return (mark1+mark2/2);
        }

       void disp(){
           std::cout<< " The student named: "<< name<< "\n has an average score equal to: " << calc_media()<<"\n";
        }



};
#endif  //<-- this too

そこにいる間に メンバー初期化リスト をコンストラクタで使用します。

student_Example::student_Example(char nam, int marc1, int marc2) :
    name(nam),
    mark1(marc1),
    mark2(marc2) //assume maerc2 was a typo
{    
}


編集 なお student_Example(char nam, int marc1, int marc2) を取るコンストラクタを定義する宣言です。 char と2つの int のように、cppファイルで行っていますね。

このようなオブジェクトを作ることができます。

student_Example example('n', 1, 2);

このデフォルトでないコンストラクタがなければ、パラメータを取らないデフォルトのコンストラクタが自動的に生成されるので、このようなオブジェクトを作ることができたはずです。

student_Example example;

これで、もう起こらないであろうコンストラクタを定義しました。これをクラスに追加するか、パラメータを取るコンストラクタを使用する必要があります。