функция и переменная не объявлены в этой области (c ++) - PullRequest
0 голосов
/ 11 февраля 2020

Я немного застрял на своей домашней работе и мог бы немного помочь. Я определенно не ищу кого-то, кто сделает мою домашнюю работу для меня, но я уверен, что мог бы использовать некоторые предложения.

Я действительно извиняюсь за публикацию в топике c, который уже был опубликован в десятки раз. Я прочитал, что я мог найти, и я все еще застрял.

С программой связано 3 файла - app. cpp имеет main, student.h имеет прототипы функций и определения класса. студент. cpp имеет все функции.

Мы только начали изучать классы, и это задание - просто упражнение с использованием класса. Он сравнивает два студенческих идентификатора, чтобы найти меньшие, а затем проверяет, достаточно ли высокий 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;
}

student.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

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Эти функции

    isLessThanByID(s2);
    qualifyForHonor(minGpaForHonor);

не являются статичными c функциями-членами класса Student. Таким образом, они должны вызываться с объектом класса так же, как вызывается функция-член 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.

Функции могут быть определены, например, следующим way

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;
1 голос
/ 11 февраля 2020

isLessThanByID и qualifyForHonor являются функциями-членами в классе Student, поэтому должны вызываться на экземпляре класса Student.

        isLessThanByID(s2);
        qualifyForHonor(minGpaForHonor);

должно быть изменено на

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

Сказав это, вы, вероятно, имеете больше ошибок, чем это. Объявление функции bool qualifyForHonor(double minGpaForHonor) const в классе Student также не совпадает с ее сигнатурой в определении.

0 голосов
/ 11 февраля 2020

Кажется, вы путаете границы. Например, рассмотрим этот класс и как правильно вызывать его методы.

class Foo {
    void Bar1();
    static void Bar2();
};

Foo foo;
foo.Bar1();
foo::Bar2();

Это также верно для переменных. Поэтому вы должны использовать s1.isLessThanByID(s2); и s1.qualifyForHonor(minGpaForHonor); вместо.

Ваша функция qualifyForHonor должна быть stati c или исключена из класса, так как она не использует никакого члена, только параметры, передаваемые в это.

Кроме того, эта строка немного странная для меня: if(s1.isLessThanByID (s2) == > 0), чего вы пытались достичь здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...