[解決済み】"...... "のプロトタイプがクラス"...... "内のどれとも一致しない。
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;
これで、もう起こらないであろうコンストラクタを定義しました。これをクラスに追加するか、パラメータを取るコンストラクタを使用する必要があります。
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】'std::cout'への未定義の参照