0

こんにちは、私は C++ コースを受講しており、ユーザー定義クラスの使用方法を学んでいますが、my bool に問題があります。この時点までに到達できるのは、コンパイル時にエラーが発生することです

「StudRd::ValidRd() の呼び出しに一致する関数はありません。注: 候補は次のとおりです: bool StudRd::ValidRd(StudRd&) const」

クラスを使用するのはこれが初めてであるだけでなく、bool 関数を使用するのも初めてです。私はこれを経験し、同様の問題を何時間もグーグルで検索しましたが、理解に近づいていないと感じています。

#include "stud.h"
int main()
{
  ifstream inFile;
  ofstream outFile;
  inFile.open("in.data");
  outFile.open("out.data");
  if(inFile.fail() || outFile.fail())//Checks the in and out files
{
    cout << "input file or output file opening failed" << endl;
}
  StudRd rd;                    //Declares an object of the class
  rd.DefaultRd();              //Default constructor
  outFile << "*~<Student Exam Report>~*" << endl;
  outFile << "Stud id" << setw(10) << "Exam 1" << setw(10) << "Exam 2" << setw(10) <<     "Exam 3" << setw(10) << "Avg" << endl;
rd.ReadRd(inFile, rd);
while(inFile){           //Loop until the file runs out of data
  rd.ValidRd(rd);                //Determines if data read is valid
  if(rd.ValidRd()){           //if statement is executed if bool returns valid
    rd.ValidCountRd(rd);
    rd.findAvg(rd);           //Function that figures out an average for the struct
    rd.MaxOfAllExams(rd);     //finds the highest valid exam
    rd.WriteRd(outFile, rd);  //Function that writes the struct to the outFile
  }
  else{
    rd.InvalidCountRd(rd);
    rd.WriteInvalidRd(outFile, rd);
  }
rd.ReadRd(inFile, rd);                //function that reads from the infile and assigns to a structure
 }
  rd.AvgOfAllExams(rd);                 //finds the average of all valid exams
  rd.WriteFooterRd(outFile, rd);        //Writes the footer containing max, avg, pass, fail, valid, invalid
  outFile << "*** END ***" << endl;
  return 0;
}

クラスと関数の実装は次のとおりです

#include "stud.h"

void StudRd :: DefaultRd()
{
  id = -111;
  exam1 = -100;
  exam2 = -100;
  exam3 = -100;
  numValid = 0;
  numInvalid = 0;
  numPass = 0;
  numFail = 0;
}

bool StudRd :: ValidRd(StudRd& rd) const
{
  return(111 <= rd.id <= 999 &&
         0 <= rd.exam1 <= 100 &&
         0 <= rd.exam2 <= 100 &&
         0 <= rd.exam3 <= 100);
}

void StudRd :: ValidCountRd(StudRd& rd)
{
  rd.numValid++;
}

void StudRd :: InvalidCountRd(StudRd& rd)
{

  rd.numInvalid++;
}

void StudRd :: MaxOfAllExams(StudRd& rd)
{
    if(rd.examMax < rd.exam1){
      rd.examMax = rd.exam1;
}
    if(rd.examMax < rd.exam2){
      rd.examMax = rd.exam2;
    }
    if(rd.examMax < rd.exam3){
      rd.examMax = rd.exam3;
    }
}

void StudRd :: AvgOfAllExams(StudRd& rd)
{
  rd.avgOfAllExams = rd.examSum / rd.numValid;
}

void StudRd :: ReadRd(ifstream& inFile, StudRd& rd)
{
  inFile >> rd.id >> rd.exam1 >> rd.exam2 >> rd.exam3;
}

void StudRd :: WriteRd(ofstream& outFile, StudRd rd)
{
  inFile >> rd.id >> rd.exam1 >> rd.exam2 >> rd.exam3;
}

void StudRd :: WriteRd(ofstream& outFile, StudRd rd)
{
  outFile.setf(ios::fixed);
  outFile.setf(ios::showpoint);
  outFile.precision(2);
  outFile << rd.id<< setw(10) << rd.exam1 << setw(10) << rd.exam2 << setw(10) << rd.exam3 << setw(10) << rd.avg << setw(10) << rd.passFail << endl;
}

void StudRd :: WriteInvalidRd(ofstream& outFile, StudRd rd)
{
  outFile.setf(ios::fixed);
  outFile.setf(ios::showpoint);
  outFile.precision(2);
  outFile << rd.id << setw(10) << rd.exam1 << setw(10) << rd.exam2 << setw(10) << rd.exam3 << setw(10) << "Invalid Data" << endl;
}

void StudRd :: WriteFooterRd(ofstream& outFile, StudRd rd)
{
  outFile.setf(ios::fixed);
  outFile.setf(ios::showpoint);
  outFile.precision(2);
  outFile << ">>> Max of All Valid Exams: " << rd.examMax << endl;
  outFile << ">>> Average of All Valid Exams: " << rd.avgOfAllExams << endl;
  outFile << endl;
  outFile << "Number of Valid Data: " << rd.numValid << "   Number of Invalid Data: " << rd.numInvalid << endl;
  outFile << "Number of Students Passed: " << rd.numPass << "   Number of Students Failed: " << rd.numFail << endl;
}

void StudRd :: findAvg(StudRd& rd)
{
  rd.avg = float(rd.exam1 + rd.exam2 + rd.exam3)/float(3);
  rd.examSum = rd.examSum + rd.avg;
  if(rd.avg < 70){
    rd.passFail = "F";
    numFail++;
  }
  else{
    rd.passFail = "P";
    numPass++;
  }
}





#include <fstream>
#include <iostream>
#include <iomanip>

using namespace std;

//Creates the structure Studrd
class StudRd
{
  public:
  void DefaultRd();

  bool ValidRd(StudRd& rd) const;

  void ValidCountRd(StudRd& rd);

  void InvalidCountRd(StudRd& rd);

  void MaxOfAllExams(StudRd& rd);

  void AvgOfAllExams(StudRd& rd);

 void ReadRd(ifstream& inFile, StudRd& rd);

 void WriteRd(ofstream& outFile, StudRd rd);

 void WriteInvalidRd(ofstream& outFile, StudRd rd);

 void WriteFooterRd(ofstream& outFile, StudRd rd);

  void findAvg(StudRd& rd);

 private:
  int id;
  int numValid;
  int numInvalid;
  int numPass;
  int numFail;
  float exam1;
  float exam2;
  float exam3;
  float avg;
  float examMax;
  float avgOfAllExams;
  float examSum;
  string passFail;
};

何がこれを引き起こしているのか、これに関するヘルプがわからないので、少なくともコンパイルして最終的な調整を行うことができます。

誰かがエラーを見つけたら、それを指摘して、何がうまくいかなかったのかを説明してくれると、信じられないほど素晴らしいでしょう。

また、初めて希望を提出したとき、私はこれを正しく行いました。

4

2 に答える 2

3

関数を次のように宣言および定義しました。

bool ValidRd(StudRd& rd) const; 
             ^^^^^^^^^^^ 

しかし、あなたはそれを次のように呼び出そうとしています:

if(rd.ValidRd()){      
             ^^^

パラメーターなしで、明らかに、パラメーターを取らない関数を宣言しなかったため、コンパイラーは文句を言います。ValidRd()入力パラメーターを取らない名前の関数は見つかりません。

于 2012-09-27T03:18:21.917 に答える
0

では、エラー メッセージの内容を見てみましょう。翻訳すると、「引数なしで StdRd::ValidRd という名前のメソッドを呼び出そうとしています。私が見つけることができる最も近いメソッドは、StdRd への参照を取る StdRd::ValRD() です。」

ここで、エラーが表示された行の行番号 (おそらく ":36:" のようなコロンの間) を含むエラー メッセージ全体を確認すると便利ですが、それまでの間、ValRd を呼び出すすべての場所を確認してください。

于 2012-09-27T03:21:30.247 に答える