第二章,第三章 (2):接口与实现相分离
1.代码书写
一套实用的面向对象代码需要实现以下三点
1.这个类是可复用的。
2.这个类的客户知道该类提供了什么成员函数,如何调用它们,以及期望的返回值类型。
3.客户不知道这个类的成员函数如何实现。
因此我们将代码放在三个文件中
Gradebook.h
#include <string>
class GradeBook
{
public:
explicit GradeBook(std::string name);
void setCourseName(std::string name);
std::string getCourseName()const;
void displayMessage()const;
void determineClassAverage()const;
private:
std::string courseName;
};
Gradebook.cpp
#include "GradeBook.h"
#include <iostream>
#include <iomanip>
using namespace std;
GradeBook::GradeBook(string name)
{
setCourseName(name);
}//显式声明
void GradeBook::setCourseName(string name)
{
if(name.size() <= 25)
{
courseName = name;
}
else
{
courseName = name.substr(0, 25);
cerr << "Name \"" << name << "\" exceeds maximum length(25).\n"
<< "Limiting course name to first 25 characters.\n" << endl;
}
}//设置
string GradeBook::getCourseName()const
{
return courseName;
}//获取
void GradeBook::displayMessage()const
{
cout << "Welcome to the course name for " << getCourseName() <<endl;
}
void GradeBook::determineClassAverage()const
{
int total = 0;
double totalAverager = 0;
int grade = 0;
int gradeCounter = 0;
cout << "Enter grade or -1 to quit : ";
cin >> grade;
while(grade != -1)
{
total += grade;
gradeCounter++;
cout << "Enter grade or -1 to quit : ";
cin >> grade;
}
if(gradeCounter != 0)
{
totalAverager = static_cast<double>(total)/gradeCounter; //average grade
cout << "Total Grade : " << total << endl;
cout << "Average Grade : " << totalAverager << endl;
}
}
main.cpp
#include <iostream>
#include <string>
#include "GradeBook.h"
using namespace std;
int main()
{
GradeBook myGradeBook("default string");
string courseName;
myGradeBook.displayMessage();
cout << "please enter the grade book" << endl;
getline(cin, courseName);
myGradeBook.setCourseName(courseName);
myGradeBook.displayMessage();
myGradeBook.determineClassAverage();
return 0;
}
2.解析
图片截自《C++大学教程》
需要注意以下几点
1.一般在.h里不用using namespace std声明名字空间。而用二元作用域分辨运算符::。
2.自己创建的文件用“ ”包含,官方库用<>包含。原因是使用“”会优先在私有库里查找匹配。