Не работает дружественный класс

175
23 мая 2018, 01:40

Не работает дружественный класс (ошибка в функции show). Как организовать доступ к классу Teacher?

class Teacher;
class Student;
class Student
{
private:
string surname;
int count;
int *marks;
public:
Student(string surname,int count) : surname(surname), count(count)
{
    marks = new int[count] {};
}
Student(const Student & t)
{
    cout << "\nCOPY\n";
}
~Student()
{
    delete[] marks;
}
void show(const Teacher & B)
{
    cout << "\nSurname: " << surname<<endl;
    cout << "Amount: " << count << endl << endl;
    for (int i = 0; i < count; i++)
        cout << "Mark " << i << " = " << marks[i]<<"\t"<<B.surname[i]<<"\t"<<B.subject[i] << endl;
}
friend class Teacher;
};
class Teacher
{
private:
static int i;
string* surname;
string* subject;
public:
Teacher(int count)
{
    surname = new string[count]{};
    subject = new string[count]{};
}
~Teacher()
{
    delete[]surname;
    delete[]subject;
}
void fill(Student & A)
{
    if (i == A.count)
    {
        cout << "FULL!\n\n";
        return;
    }
    cout << "Enter teacher's surname: ";
    cin >> surname[i];
    cout << "Enter subkect: ";
    cin >> subject[i];
    reset:
    cout << "Enter mark: ";
    cin >> A.marks[i];
    if (A.marks[i] > 12 || A.marks[i] < 1)
    {
        cout << "Input error\n";
        goto reset;
    }
    i++;
}
friend class Student;
};
int Teacher:: i = 0;
void main()
{
int count;
string surname;
reset:
cout << "Enter amount of marks: ";
cin >> count;
if (count < 1)
{
    cout << "ERROR!\n";
    goto reset;
}
cout << "Enter student's surname: ";
cin >> surname;
Student A(surname, count);
Teacher B(count);
while ('a')
{
    int s;
    cout << "Select (1-info, 2-set mark, 3-exit):";
    cin >> s;
    switch (s)
    {
    case 1:
        A.show(B);
        break;
    case 2:
        B.fill(A);
        break;
    case 3:
        cout << "\n\n\tBYE !!!\n\n\n";
        return;
        break;
    default:
        cout << "Input error!\n";
        break;
    }
}
}
Answer 1

Не вдаваясь в корректность кода в смысле результатов работы (делает ли он то, что надо по заданию), просто рассказываю, как его изменить для компиляции:

В классе вы оставляете только объявление:

    ~Student()
    {
        delete[] marks;
    }
    void show(const Teacher & B);
    friend class Teacher;
};

А потом, уже после описания класса Teacher, даете определение функции-члена:

void Student::show(const Teacher & B)
{
    cout << "\nSurname: " << surname<<endl;
    cout << "Amount: " << count << endl << endl;
    for (int i = 0; i < count; i++)
        cout << "Mark " << i << " = " << marks[i]<<"\t"<<B.surname[i]<<"\t"<<B.subject[i] << endl;
}

Все скомпилируется...

READ ALSO
Нужно найти ошибку в коде

Нужно найти ошибку в коде

У меня почему-то программа не видит ArrayПодскажите в чем ошибка и как правильно реализовать вычитание элемента от матрицы?

251
Ошибка в коде: Нарушение прав доступа при чтении некого адреса

Ошибка в коде: Нарушение прав доступа при чтении некого адреса

Не могу понять в чем ошибка, помогите ее исправить( При компиляции выдает ошибку "нарушение прав доступа при чтении некого адреса" Если ввожу...

160
Redux. После combineReducers пропадает состояние

Redux. После combineReducers пропадает состояние

Есть 2 редюсераЕсли подключен только один из них - все работает, но при подключении combineReducers все состояние превращается в undefined, т

193