未在此作用域中声明的函数和变量 (C++)
function and variable not declared in this scope (c++)
我有点困在家庭作业上,可能需要一点帮助。我绝对不是在寻找为我做功课的人,但我肯定可以使用一些建议。
我真的很抱歉在一个已经发布过几十次的主题上发帖。我已经通读了我能找到的内容,但我仍然被困住了。
该程序有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
isLessThanByID
和qualifyForHonor
是类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)
,你想在这里实现什么?
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用