第六次实验报告
#include<iostream> using namespace std; class base1 { public: base1(int m = 0, int n = 0) :m1(m), n1(n) {}; void setnumber1(int m0, int n0) { m1 = m0; n1 = n0; }; int getnumber1() { return m1 + n1; }; private: int m1, n1; }; class base2 { public: base2(int m = 0, int n = 0) :m2(m), n2(n) {}; void setnumber2(int m0, int n0) { m2 = m0; n2 = n0; }; int getnumber2() { return m2 - n2; }; private: int m2, n2; }; class base3 { public: base3(int m = 0, int n = 0) :m3(m), n3(n) {}; void setnumber3(int m0, int n0) { m3 = m0; n3 = n0; }; int getnumber3() { return m3 * n3; }; private: int m3, n3; }; class base4 { public: base4(int m = 0, int n = 0) :m4(m), n4(n) {}; void setnumber4(int m0, int n0) { m4 = m0; n4 = n0; }; double getnumber4() { return (double)m4 / n4; }; private: int m4, n4; }; class A :public base1,public base2 { public: A(int m=1, int n=1) :base1(m, n), base2(m, n) {}; }; class B :public base1,public base3 { public: B(int m=1, int n=1) :base1(m, n), base3(m, n) {}; }; class C :public base1,public base4 { public: C(int m=1, int n=1) :base1(m, n), base4(m, n) {}; }; int main() { A a; B b; C c; cout << a.getnumber2() << endl; cout << b.getnumber3() <<endl; cout << c.getnumber4() <<endl; a.setnumber2(2, 5); b.setnumber3(2, 5); c.setnumber4(2, 5); cout << a.getnumber2() << endl; cout << b.getnumber3() << endl; cout << c.getnumber4() << endl; return 0; }
#include<iostream> using namespace std; class vehicle { public: vehicle(int maxspeed0=0,int weight0=0):maxspeed(maxspeed0), weight(weight0){} ~vehicle(){} void run() { cout << "run" << endl; } void stop() { cout << "stop" << endl; } private: int maxspeed, weight; }; class bicycle:virtual public vehicle { public: bicycle(int maxspeed1 = 0, int weight1 =0, int height1 = 0) :vehicle(maxspeed1, weight1), height(height1){} ~bicycle(){}; private: int height; }; class motorcar :virtual public vehicle { public: motorcar(int maxspeed2 = 0, int weight2 = 0, int seatnum2=0):vehicle(maxspeed2, weight2), seatnum(seatnum2){} ~motorcar(){} private: int seatnum; }; class motorcycle :public bicycle, public motorcar { public: motorcycle(int maxspeed3 = 0, int weight3 = 0, int height3 = 0,int seatnum3=0):bicycle(maxspeed3,weight3,height3),motorcar(maxspeed3,weight3,seatnum3){} ~motorcycle(){} }; int main() { motorcycle M(6, 6, 6, 6); M.run(); M.stop(); return 0; }
fraction.h
#pragma once class Fraction { public: Fraction(); Fraction(int top0, int bottom0); Fraction(int top0); void Compare(Fraction&f0); void set_fraction(); void get_fraction(); Fraction operator+(const Fraction&f0)const; Fraction operator-(const Fraction&f0)const; Fraction operator*(const Fraction&f0)const; Fraction operator/(const Fraction&f0)const; ~Fraction(); private: int top; int bottom; };
fraction.cpp
#include"Fraction.h" #include<iostream> using namespace std; Fraction::Fraction() :top(0), bottom(1) {} Fraction::Fraction(int top0) : top(top0), bottom(1) {} Fraction::Fraction(int top0, int bottom0) : top(top0), bottom(bottom0) {} Fraction::~Fraction() {} void::Fraction::set_fraction() { cin >> top >> bottom; } void::Fraction::get_fraction() { cout << top << "/" << bottom << endl; } Fraction Fraction:: operator+(const Fraction&f0)const { return Fraction(f0.top*bottom + top * f0.bottom, f0.bottom*bottom); } Fraction Fraction:: operator-(const Fraction&f0)const { return Fraction(top * f0.bottom - f0.top*bottom, f0.bottom*bottom); } Fraction Fraction:: operator*(const Fraction&f0)const { return Fraction(top * f0.top, f0.bottom*bottom); } Fraction Fraction:: operator/(const Fraction&f0)const { return Fraction(top * f0.bottom, bottom * f0.top); } void::Fraction::Compare(Fraction&f0) { if ((top * f0.bottom - f0.top*bottom)>0) cout << top << "/" << bottom << ">" << f0.top << "/" << f0.bottom << endl; else if ((top * f0.bottom - f0.top*bottom)<0) cout << top << "/" << bottom << "<" << f0.top << "/" << f0.bottom << endl; else cout << top << "/" << bottom << "=" << f0.top << "/" << f0.bottom << endl; }
ifraction.h
#pragma once #include"fraction.h" class iFraction: public Fraction{ public: iFraction(int top, int bottom, int wnum) ; void showiFraction() ; private: int wnum; };
ifraction.cpp
#include"ifraction.h" #include<iostream> using namespace std; iFraction::iFraction(int top0, int bottom0, int wnum0): Fraction(top0,bottom0),wnum(wnum0) {} void iFraction::showiFraction() { cout << wnum<<" "; get_fraction(); }
main.cpp
#include"fraction.h" #include"ifraction.h" #include<iostream> using namespace std; int main() { Fraction f(1, 1); Fraction f1(2, 2); Fraction f3 = f1 + f; iFraction f4(1, 2, 3); f3.get_fraction(); f3 = f1 - f; f3.get_fraction(); f3 = f1 * f; f3.get_fraction(); f3 = f / f1; f3.get_fraction(); f4.showiFraction(); return 0; }
做第一二题没有注意要求分文件,加上这两题不是很复杂,就没有采用分文件。
在第三题时发现了一些问题,因为fraction.h需要被多次包含,就出现了了重复编译的问题,这时候就需要采用宏或者预编译头的方式来避免重复编译
还有一个问题我没有解决,本来我在fraction类中是定义了复制构造函数的,但是在重载运算符时,创建了临时无名对象作为返回值时,显示fraction类中没有合适的复制构造函数。后来我把自己定义的复制构造函数删除之后就没有问题了,没有想明白,不知道谁可以为我解答吗?