c++ 引用相同变量的多个函数

c++ Multiple functions referring to same variables

本文关键字:函数 变量 引用 c++      更新时间:2023-10-16

我正在通过书中的练习来熟悉用户定义的函数和使用文件。在这个特定的练习中,我将使用我列出的函数分别查找男性和女性学生的平均考试成绩。它们将从现有文件中读取。当我开始编写函数原型时,我有所有这些不同的名称来引用main中的相同变量。据我所知,这本书不鼓励在不同的函数中使用相同的变量。所以,我的问题是,这是矫枉过正、草率还是好的做法?

更新:为了澄清我所说的"引用相同的变量"是什么意思......

在主要情况下,我有一个名为maleScoreSum的变量,它是一个用于保存男性考试分数总和的变量。到目前为止,此变量在三个函数中被引用。它是函数初始化中的 sumM,下一个函数中的 Msum 和之后函数中的 mSum。这是正确的方法吗?如果所有函数都使用 maleSum 之类的东西来引用 main 中的变量,可以(或更好(吗?我快到本书的结构化编程部分的结尾了,还没有到OOP部分的类等等。此外,到目前为止,没有一个练习程序允许使用全局变量。

原型:

void openFile(ifstream& inDat, ofstream& outDat);
void initialize(int& countF, int& countM, double& sumF, double& sumM, double& avgF, double& avgM);
void sumGrades(ifstream& inDat, double& Fsum, double& Msum);
void averageGrade(int& fCount, double& fSum, int& mCount, double& mSum);
void printResults(int fAvg, int mAvg);

主变量:

    ifstream inData;
ofstream outData;
int no_of_females;
int no_of_males;
double maleScoreSum;
double femaleScoreSum;
double maleAverage;
double femaleAverage;

我还注意到,当我按ctrl K并粘贴代码时,我一次只能粘贴一行。感谢您的任何帮助。

就过程编程而言,这种方法很好。您也可以在全局范围内声明并直接访问它们

ifstream inData;
ofstream outData;
int no_of_females;
int no_of_males;
double maleScoreSum;
double femaleScoreSum;
double maleAverage;
double femaleAverage;
void openFile(){
    inData = ...
}

但是C++为您提供了更方便的工具。例如,您可以使用上下文方法:

struct Context{
    ifstream inData;
    ofstream outData;
    int no_of_females;
    int no_of_males;
    double maleScoreSum;
    double femaleScoreSum;
    double maleAverage;
    double femaleAverage;
};
void openFile(Context& context);
void initialize(Context& context);
void sumGrades(Context& context);
void averageGrade(Context& context);
void printResults(Context& context);

或使用成员函数

class AverageGrade{
    ifstream inData;
    ofstream outData;
    int no_of_females;
    int no_of_males;
    double maleScoreSum;
    double femaleScoreSum;
    double maleAverage;
    double femaleAverage;
public:
    void openFile();
    void initialize();
    void sumGrades();
    void averageGrade();
    void printResults();
};

但是在这一点上,你应该弄清楚你的课堂内部需要哪些数据,在课堂外需要哪些数据。您可以创建更复杂的结构

class Grade{
    int numberOfStudents;
    double scoreSum;
    public:
    double calculateAvarage();
};
class GradeParser{
public:
    void openFile();
    void initialize();
    Grades getFemaleGrades();
    Grades getMaleGrades();
};
class GradePrinter{
public:
    void openFile();
    void initialize();
    void PrintResults(const Grade& maleGrade, const Grade& femaleGrade);
};