【问题标题】:C++ compiler not recognizing header fileC++ 编译器无法识别头文件
【发布时间】:2015-10-28 05:52:28
【问题描述】:

我是 C++ 新手。我正在尝试在 Visual Studio 上练习编译程序,但在解读编译器错误时遇到了一些麻烦。我真的可以使用一些帮助来弄清楚如何正确调试和编译程序,这样我以后在编译代码时就不会遇到太多麻烦了。

我有三个文件:Gradebook.h、Gradebook.cpp 和 Source1.cpp。 Gradebook.h 在头文件中,另外两个在解决方案资源管理器的源文件中。

编辑:我遇到了一堆语法错误和其他不必要的 cmets,这让我很难阅读自己的代码。 (感谢雷和其他所有人)。下面是我修改后的代码。我还发现了如何正确使用代码示例工具,所以现在所有内容都应该正确缩进。

    #include <string>
    using namespace std;

    class GradeBook
    {
    public:
        //constants
        static const int students = 10; //number of tests
        static const int tests = 3;  //number of tests

        //constructor initializes course name and array of grades
        string Gradebook(string, const int[][tests]);

        void setCourseName(string); //function to set course name
        string getCourseName(); //function to retrieve the course name
        void displayMessage(); //display a welcome message
        void processGrades(); //perform various operations on the grade data
        int getMinimum(); //find the minimum grade in the grade book
        int getMaximum(); //find the maximum grade in the grade book
        double getAverage(const int[], const int); // get student's average
        void outputBarChart(); //output bar chart of grade dist
        void outputGrades(); //output the contents of the grades array

    private:
        string courseName; //course name for this gradebook
        int grades[students][tests]; //two-dimensional array of grades
    }; //end class GradeBook

I don't get any errors in Gradebook.h, but the main problem lies in my other source files:

#include <iostream>
#include <iomanip>
using namespace std;

//include definition of class GradeBook from GradeBook.h
#include "GradeBook.h"

// two-argument constructor initializes courseName and grades array
GradeBook:: GradeBook(string name, const int gradesArray[][GradeBook::tests])
{
    setCourseName(name); //initialize coursename

    //copy grades from gradeArray to grades
    for (int student = 0; student < students; ++student)

        for (int tests = 0; tests < tests; ++tests)
            grades[student][tests] = gradesArray[student][tests];
} //end two argument GradeBook constructor

//function to set the course name
void GradeBook::setCourseName(string name)
{
    courseName = name;
}

GradeBook::Gradebook(string, const int[][tests])
{
}

void GradeBook::setCourseName(string)
{
}

//function to retrieve the course name 
string GradeBook::getCourseName()
{
    return courseName;
} 

//display a welcome message to GradeBook user
void GradeBook::displayMessage()
{
    //statements calls getCourseName to get the name of the course the gradebook represents
    cout << "Welcome to the grade book for \n" << getCourseName() << "!"
        << endl;
} 

//perform various operations on the data
void GradeBook::processGrades()
{
    outputGrades(); //output grades array

    // call functions getMinimum and getMaximum
    cout << "\nLowest grade in the grade book is " << getMinimum()
        << "\nHighest grade in the grade book is " << getMaximum() << endl;

    outputBarChart(); //display distribution chart of grades on all tests
} 

//find minimum grade in the entire Gradebook
int GradeBook::getMinimum()
{
    int lowGrade = 100; //assume lowest grade is 100;
    //loop through rows of grades array
    for (int student = 0; student < students; ++student)
    {
        //loop to columns of current row
        for (int tests = 0; tests < tests; ++tests)
        {
            //if current grade less than lowGrade, assign it to lowGrade
            if (grades[student][tests] < lowGrade)
                lowGrade = grades[student][tests]; //new lowest grade
        }
    } 
    return lowGrade; 
} 

//find maximum grade in the entire gradebook
int GradeBook::getMaximum()
{
    int highGrade = 0; //assume highest grade is 0

    for (int student = 0; student < students; ++student)
    {
        //loop to columns of current row
        for (int tests = 0; tests < tests; ++tests)
        {
            //if current grade less than highGrade, assign it to highGrade
            if (grades[student][tests] > highGrade)
                highGrade = grades[student][tests]; //new highest grade
        }
    }  
    return highGrade; 

} 

//determine average grade for particular set of grades
double GradeBook::getAverage(const int setOfGrades[], const int grades)
{
    int total = 0; //initialize total

    //sum grades in array
    for (int grade = 0; grade < grades; ++grade)
        total += setOfGrades[grade];

    //return average of grades
    return static_cast <double>(total) / grades;
} 

//output bar chart displaying grade distribution
void GradeBook::outputBarChart()
{
    cout << "\nOverall grade distribution: " << endl;

    //stores frequency of grades in each range of 10 grades
    const int frequencySize = 11;
    int frequency[frequencySize] = {}; //initalize elements to 0;

    //for each grade, increment the appropriate frequency
    for (int student = 0; student < students; ++student)
        for (int tests = 0; tests < tests; ++tests)
            ++frequency[grades[student][tests] / 10];

    //for each grade frequency, print bar in chart
    for (int count = 0; count < frequencySize; ++count)
    {
        //output bar label (0-9, 90-99, 100)
        if (count == 0)
            cout << "0-9: ";
        else if (count == 10)
            cout << "100: ";
        else
            cout << count * 10 << "-" << (count * 10) + 9 << ": ";

        //print bar of asterisks
        for (int stars = 0; stars < frequency[count]; stars)
            cout << '*';

        cout << endl;
    }
}

//output the contents of the grades array
void GradeBook::outputGrades()
{
    cout << "\nThe grades are: \n\n";
    cout << "             "; //align column heads

    //create a column heading for each of the tests
    for (int tests = 0; tests < tests; ++tests)
        cout << "Test" << tests + 1 << " ";

    cout << "Average" << endl; //student average column heading

    //create rows/columns of text representing array grades
    for (int student = 0; student < students; ++student)
    {
        cout << "Student " << setw(2) << student + 1;

        //output student's grades
        for (int tests = 0; tests < tests; ++tests)
            cout << setw(8) << grades[student][tests];

        //call member function getAverage to calculate student's average
        //pass row of grades and the value of tests as the arguments
        double average = getAverage(grades[student], tests);
        cout << setw(9) << setprecision(2) << fixed << average << endl;
    }
}

我在这里收到的主要错误如下:

GradeBook:: GradeBook(string name, const int gradesArray[][GradeBook::tests])

错误:没有重载函数“GradeBook::GradeBook”的实例与指定的类型匹配。

GradeBook::Gradebook(string, const int[][tests])
{
}

错误:缺少显式类型(假定为“int”)和错误:声明与“std::string 成绩簿”不兼容(在第 12 行声明)。

我真的很困惑和沮丧。您可以提供的任何见解都将非常有帮助。这是我教科书中的一个例子,几乎是逐字逐句的,过去两个小时我一直在尝试找出遗漏的内容。

我拥有的最后一个源文件如下:

#include "Gradebook.h"
#include "Source1.h"

//function main begins program execution
int main()
{
    //two-dimensional array of student grades
    int gradesArray[ GradeBook::students][GradeBook::tests] =
    {
        {87, 96, 70},
        {68, 87, 90},
        {94, 100, 90},
        {100, 81, 82},
        {83, 65, 85},
        {78, 87, 65},
        {85, 75, 83},
        {91, 94, 100},
        {76, 72, 84},
        {87, 93, 73}
    }

GradeBook myGradebook("CS101 Introduction to C++ Programming", gradesArray);
myGradeBook.displayMessage();
myGradeBook.processGrades();
} //end main

我在最后几行收到错误: 成绩簿 myGradebook("xxxx") 收到错误:预期为“;” ..但我不是已经有了吗?

和 myGradebook.displayMessage();错误:标识符“myGradeBook”未定义。

请给我建议并指出正确的方向。我迫切需要帮助。

【问题讨论】:

  • 因为你在.cpp中访问测试,你必须使用Gradebook::tests而不是tests
  • 嗨,劳尔,当我这样做时,我收到以下错误:必须是类或命名空间名称。我真的很困惑。
  • 在您的 .h 中,您打错字了....您必须将 string Gradebook(....) 更改为 string GradeBook(...)
  • @Clark 获取支持错误突出显示和正确缩进的 IDE。
  • @Raul: 更多 GradeBook(...) 没有返回类型 - 它们在构造函数中是不合法的。

标签: c++ compiler-errors namespaces


【解决方案1】:

你必须真正改进这段代码。

错误

//function to set the course name
void GradeBook::setCourseName(string name
{
courseName = name;
})//end function setCourseName

正确

//function to set the course name
void GradeBook::setCourseName(string name)
{
courseName = name;
}//end function setCourseName

====

错误

//find maximum grade in the entire gradebook
int GradeBook::getMaximum)

正确

//find maximum grade in the entire gradebook
int GradeBook::getMaximum()

【讨论】:

  • 谢谢!天哪,我一直在查看我的代码,我什至没有意识到我犯了多少小错误。感谢您花时间指出这些。
  • @Clark,欢迎您,尽管获得支持也不错:)
【解决方案2】:

我在您发布的代码中注意到的一些问题:

括号中的错别字

//function to set the course name
void GradeBook::setCourseName(string name
{
courseName = name;
})//end function setCourseName

括号末尾有一个错字,由于不必要的// end function 注释,您可能更难以注意到。应该是:

void GradeBook::setCourseName(string name)
{
    courseName = name;
}

未定义变量

错误提示错误:标识符“测试”未定义。

for (int student = 0; student < students; ++student)
    for (int test = 0; tests < tests; ++test)
        grades[student][test] = gradesArray[student][test];
}

应该是:for (int test = 0; /* not tests */ test &lt; GradeBook::tests; ++test)

定义与声明

但是 setCourseName 不是已经在“Gradebook.h”中定义了吗??

方法在头文件中没有定义,是声明的。不同之处在于定义包含代码体,而声明不包含。换句话说,method_name(); 是一个声明,method_name() { /* empty body */ } 是一个定义。

类名无效 - 区分大小写

由于拼写错误,您还有一些其他语法错误。类名是GradeBook,而不是您在下面编码的Gradebook

//perform various operations on the data
void Gradebook::processGrades()
{
    outputGrades(); //output grades array
    // ...
}

无效的ctor声明

错误:缺少显式类型(假定为“int”)和错误:声明 与“std::string Gradebook”不兼容(在第 12 行声明)。

这个错误的原因是你在你的头文件中声明ctor的方式GradeBook.h

string Gradebook(string, const int[][tests]);

标头中的构造函数声明有 2 个错误:

  1. 名称应与类的名称匹配,即GradeBook(大写B),并且
  2. 构造函数具有string 或任何其他原语的返回类型。它应该是GradeBook(string, const int[][tests]);,因为它返回一个自身的实例作为类型。

简而言之,应该如下所示:

Gradebook(string, const int[][tests]);  // does not return std::string

重复的 ctor 定义

你已经定义了同一个ctor两次,第二个在第一个下面几行,如下所示:

GradeBook::Gradebook(string, const int[][tests])
{
}

您应该删除其中一个。

括号上的错字 - 续集

这行代码

int GradeBook::getMaximum)

应该是

int GradeBook::getMaximum()
//                       ^ note this guy

其他提示

提示 1: 有时一个语法错误会级联并导致编译器列出一堆其他非错误。一旦您修复了一个,其他几个也可能会消失,因此请尝试经常重建。

提示 2: 尝试使用非静态常量,同时让你的东西正常工作。声明和初始化静态变量可能比其他方法稍微复杂一些。

提示 3: 可能没有理由将 static 成员设置为 public。不要发布任何不需要的内容,如果需要,请考虑使用方法。

提示 4: 考虑减少不必要的评论噪音。您实际上不需要在每次关闭大括号时添加注释以表明您正在结束一个部分。写a = a + 1; 并添加注释// add 1 to variable 'a' 一样明显。只记录不明显的事情。

提示 5:避免在第一次尝试构建之前尝试编写所有代码。相反,当您有部分代码应该工作时,请立即按下构建按钮,然后在它实际工作后继续。

提示 6:考虑使用源代码控制管理工具,例如 Git。您会想知道在没有它的情况下您是如何尝试编写代码的。

【讨论】:

  • 感谢 Ray 提供如此彻底的回复。我修改了我的代码,所有的小语法错误基本上都消失了,除了少数几个:对于我的成绩簿::成绩簿(字符串名称,...)我收到一个新错误:+ 3 个重载。错误:没有重载函数“GradeBook::GradeBook”的实例与指定的类型匹配。
  • @Clark:不客气。 Upvotes 是在这里表达感谢的最佳方式;)我已经更新了您拥有的重复 ctor 的帖子。
  • 再次感谢雷!我删除了无效的 ctor 声明,但仍然收到相同的错误。我将所有这些建议牢记在心,现在将下载 Git!
  • @Clark:我已经更新了帖子。这是你在头文件中的声明。
  • 没关系!感谢您的所有帮助!我认为它现在工作正常!
【解决方案3】:

问题在于您的 .h 文件。您的构造函数名称打错了。你必须改变

Gradebook(string, const int[][tests]); 

string GradeBook(string, const int[][tests]);

此外,由于您在类外部访问测试变量,编译器不理解您所指的测试。所以,你必须使用

GradeBook::tests

【讨论】:

  • 啊-抱歉。不知何故,当我发布代码中省略的内容时。已添加,谢谢。
【解决方案4】:
First error:
void GradeBook::setCourseName(string name
{
courseName = name;
})//end function setCourseName


Error2:
int GradeBook::getMaximum)

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 2014-08-17
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多