未在此作用域中声明的函数和变量 (C++)

function and variable not declared in this scope (c++)

本文关键字:变量 C++ 函数 作用域 声明      更新时间:2023-10-16

我有点困在家庭作业上,可能需要一点帮助。我绝对不是在寻找为我做功课的人,但我肯定可以使用一些建议。

我真的很抱歉在一个已经发布过几十次的主题上发帖。我已经通读了我能找到的内容,但我仍然被困住了。

该程序有3个与之关联的文件 - app.cpp具有main,student.h具有函数原型和类定义。 学生.cpp具有所有功能。

我们刚刚开始学习课程,这个作业只是一个使用班级的练习。它比较两个学生 ID 以找到哪个少,然后检查与 ID 关联的 gpa 是否足够高以获得荣誉。

当我尝试编译它时,我收到一堆关于未在范围内声明的错误。我的理解是,当某些事情没有提前声明时,就会发生此错误。但是我无法弄清楚当一切都被宣布时,那可能是什么。我让学校的导师快速浏览了一下,她没有看到问题出在哪里。我要发布我的 3 个文件和我的错误消息 - 我希望它不会太多!

我真的非常感谢任何帮助!

应用.cpp

#include "student.h"
int main()
{
Student s1("G10", 3.9);
Student s2("G20", 3.5);
isLessThanByID(s2);
qualifyForHonor(minGpaForHonor);
s1.print();
s2.print();
return 0;
}

学生.h

#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
using namespace std;
class Student
{
public:
Student(const char initId[], double gpa);
bool isLessThanByID(const Student& aStudent) const;
bool qualifyForHonor(double minGpaForHonor) const;
void print()const;
private:
const static int MAX_CHAR = 100;
char    id[MAX_CHAR];
double  gpa;
};      double minGpaForHonor = 3.75;
#endif

学生.cpp


void Student::Student(const char initId[], double gpa)
{
id = initId[];
}
bool Student::isLessThanByID(const Student& aStudent) const
if(s1.isLessThanByID (s2) == > 0)
cout << "s1 is greater than s2" << endl;
}
bool Student::qualifyForHonor(double minGpaForHonor, double gpa) const
{
if (gpa >= minGpaForHonor)
{
return true;
}
}
void Student::print() const
{
cout << id << 't' << gpa << endl;
}

错误

g++  -Wall -g -std=c++11  -c -o app.o app.cpp
app.cpp: In function ‘int main()’:
app.cpp:8:2: error: ‘isLessThanByID’ was not declared in this scope
isLessThanByID(s2);
^~~~~~~~~~~~~~
app.cpp:9:2: error: ‘qualifyForHonor’ was not declared in this scope
qualifyForHonor(minGpaForHonor);
^~~~~~~~~~~~~~~
app.cpp:9:2: note: suggested alternative: ‘minGpaForHonor’
qualifyForHonor(minGpaForHonor);
^~~~~~~~~~~~~~~
minGpaForHonor
<builtin>: recipe for target 'app.o' failed
make: *** [app.o] Error 1

isLessThanByIDqualifyForHonor是类Student中的成员函数,因此应该在类Student的实例上调用。

isLessThanByID(s2);
qualifyForHonor(minGpaForHonor);

应改为

s1.isLessThanByID(s2);
s1.qualifyForHonor(minGpaForHonor);

话虽如此,您显然有更多的错误。类Student函数声明bool qualifyForHonor(double minGpaForHonor) const也与其在定义中的签名不匹配。

这些函数

isLessThanByID(s2);
qualifyForHonor(minGpaForHonor);

是类学生的非静态成员函数。因此,它们应与调用成员函数 print 的方式与调用类的对象相同

s1.print();
s2.print();

此外,这些成员函数具有未定义的行为,因为它们要么不返回任何内容,要么在某个执行路径中不返回任何内容。

bool Student::isLessThanByID(const Student& aStudent) const
{  // <=== you forgot the open brace.:)
if(s1.isLessThanByID (s2) == > 0)
cout << "s1 is greater than s2" << endl;
}
bool Student::qualifyForHonor(double minGpaForHonor, double gpa) const
{
if (gpa >= minGpaForHonor)
{
return true;
}
}

第一个函数在此语句中递归调用自己

if(s1.isLessThanByID (s2) == > 0)

使用未声明的标识符 S2。

例如,可以通过以下方式定义函数

bool Student::isLessThanByID(const Student& aStudent) const
{
return strcmp( id, aStudent.id ) < 0;       
}
bool Student::qualifyForHonor(double minGpaForHonor ) const
{
return minGpaForHonor <= gpa;
}

还要注意这个变量

double minGpaForHonor = 3.75;

定义两次,因为它的定义包含在标头中。

您可以声明变量,例如

const double minGpaForHonor = 3.75;

inline const double minGpaForHonor = 3.75;

您似乎混淆了范围。例如,考虑这个类,以及如何调用其方法的正确方法。

class Foo {
void Bar1();
static void Bar2();
};
Foo foo;
foo.Bar1();
foo::Bar2();

这对变量也有效。因此,您应该改用s1.isLessThanByID(s2);s1.qualifyForHonor(minGpaForHonor);

您的函数qualifyForHonor应该是静态的或被排除在类之外,因为它不使用任何成员,只使用传递给它的参数。

另外,这句台词对我来说有点奇怪:if(s1.isLessThanByID (s2) == > 0),你想在这里实现什么?