朋友功能奇怪的行为
Friend function strange behaviour
我正在自学c++,我编写的其中一个程序是一种学校信息系统,它不是我第一个面向对象的程序,但这次我经历了一个朋友函数的一些奇怪行为。我有一个派生类Student
,它有一个私有的Courses
对象的静态成员数组,最后是主容器类Class
,它有一个Students
对象的动态成员数组。
你可以看到student
的avg
成员是使用Courses
类的朋友函数计算的(calc_avg
接收Courses
的数组和它的成绩并除以课程号),它像一个魅力。问题一旦我开始试着计算平均成绩(class_avg
) Class
对象——我使用相同的逻辑——创建一个朋友Student
的函数(class_avarage
将可以访问每个学生avg),将获得Student
对象数组的大小,增加每个学生平均成绩和除以数组大小,出于某种原因,它接收并返回垃圾值,我试图修复它已经3个小时,我不能找到这个问题,帮助我,如果你可以-这里是相关的代码(不包括独立的派生类和输出函数被最小化):
main
//仅包含容器对象创建和IO函数(包括所有.h
文件)
Class test1;
test1.input_class();
test1.output_class();
Student.h
#include "Person.h"
#include "Courses.h"
#ifndef STUDENT_H
#define STUDENT_H
class Student : public Person
{
public:
Student();
void input_student ();
void output_student ();
friend float class_avarage (Student* array, int);
~Student();
protected:
private:
Courses my_courses [6];
float avg;
};
#endif // STUDENT_H
Student.cpp
#include "Student.h"
Student::Student()
{
//ctor
}
void Student::input_student ()
{
cout << "Please enter students info:" << endl;
input_info();
my_courses[0].input_grades ("Math");
my_courses[1].input_grades ("English");
my_courses[2].input_grades ("Science");
my_courses[3].input_grades ("History");
my_courses[4].input_grades ("Art");
my_courses[5].input_grades ("Sports");
}
void Student::output_student ()
{
int i;
cout << "Students info:" << endl;
output_info();
cout << " Course Grade" << endl;
for (i = 0; i < 6; i++)
{
my_courses[i].output_grades ();
}
avg = calc_avg(my_courses, 6);
cout << " " << "Average grade for student: " << avg << endl;
}
Student::~Student()
{
//dtor
}
float calc_avg (Courses* array, int size)
{
int i;
float sum = 0;
for (i = 0; i < size; i++)
{
sum += array[i].grade;
}
return sum/size;
}
Courses.h
#include <iostream>
#include <iomanip>
#include <string>
#ifndef COURSES_H
#define COURSES_H
using std::cout;
using std::cin;
using std::endl;
using std::string;
class Courses
{
public:
Courses();
void input_grades(string);
void output_grades();
friend float calc_avg (Courses*, int);
~Courses();
protected:
private:
string course_name;
int grade;
};
#endif // COURSES_H
Courses.cpp
#include "Courses.h"
Courses::Courses() : course_name ("Default"), grade (-1)
{
//ctor
}
void Courses::input_grades (string temp_name)
{
course_name = temp_name;
cout << "Enter " << temp_name << " grade: ";
cin >> grade;
cin.get();
}
void Courses::output_grades ()
{
cout << " " << course_name << ": " << grade << endl;
}
Courses::~Courses()
{
//dtor
}
Class.h
#include <iostream>
#include <string>
#include "Teacher.h"
#include "Student.h"
#ifndef CLASS_H
#define CLASS_H
using std::cout;
using std::cin;
using std::endl;
using std::string;
class Class
{
public:
Class();
void input_class ();
void output_class ();
~Class();
protected:
private:
string class_name;
Teacher class_teacher;
Student* pupils;
int students_number;
float class_avg;
};
#endif // CLASS_H
Class.cpp
#include "Class.h"
Class::Class() : class_name ("A"), pupils (NULL), students_number (0), class_avg (0)
{
//ctor
}
void Class::input_class ()
{
int i;
//input class data
cin >> students_number;
cin.get();
pupils = new (std::nothrow) Student [students_number];
if (!pupils)
{
cout << "Allocation failed!" << endl;
}
else
{
for (i = 0; i < students_number; i++)
{
pupils[i].input_student();
}
}
class_avg = class_avarage (pupils, students_number);
}
void Class::output_class ()
{
int i;
cout << " Displaying info of class :" << class_name << endl <<
" Class average grade: " << class_avg << endl;
class_teacher.output_teacher();
cout << " Number of students: " << students_number << endl << " Students: " << endl;
for (i = 0; i < students_number; i++)
{
pupils[i].output_student();
}
}
Class::~Class()
{
//dtor
}
float class_avarage (Student* array, int size)
{
cout << size << endl;
int i;
float total = 0;
for (i = 0; i < size; i++)
{
total += array[i].avg;
}
return total/size;
}
为什么会有人想使用好友函数呢?只需为Cource添加简单的getter。grade成员和last getter for Student.avg。这将消除获得垃圾而不是数据的可能性。此外,使用std::vector并通过std::vector&传递它们,而不是数组和指针。
相关文章:
- 类似虚拟的朋友功能?
- 有没有办法C++将给定类的功能限制为仅另一个类(不使用继承,朋友)?
- 如何让CPP核心功能成为我班的朋友
- C 朋友课程和朋友成员功能
- C 交叉相关单例.在没有朋友的情况下,我如何使用彼此的功能
- 朋友功能声明中的错误C
- 朋友功能不起作用(语法错误)
- Forward宣布了Singleton班级,并带有Freshial声明的朋友功能
- 如何朋友模板类功能
- 我的朋友功能无法访问私人变量
- 我正在尝试使用朋友功能,但我无法访问第二类的私人数据成员
- 朋友功能可访问性问题
- 防止朋友功能访问班级的私人会员
- 朋友功能声明为会员函数
- C 朋友模板功能错误
- 朋友功能无法访问私有成员变量
- 朋友功能是否继承?为什么基类朋友功能在派生的类对象上工作
- 使用模板独立enable_if时,链接器错误带有模板的朋友功能
- 朋友在课堂和外班上的功能,它有什么区别
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符