//Shape.h
#include<iostream>
using namespace std;
class Shape
{ public :
virtual void GetArea()=0;
virtual void GetPerimeter()=0;};
class Circle:public Shape
{ protected:
int m_r;
public:
Circle();
Circle(int);
virtual void GetArea();
virtual void GetPerimeter();
friend ostream &operator<<( ostream &output,
const Circle &C ) ;
Circle&operator=( Circle&);
double area,perimeter;};
class Rectangle:public Shape
{ private:
int m_w,m_h;
public:
Rectangle();
Rectangle(int,int);
virtual void GetArea();
virtual void GetPerimeter();
friend ostream &operator<<( ostream &output,
const Rectangle &R) ;
Rectangle&operator=(Rectangle&);
double area,perimeter;};
//8.2.cpp
#include "stdafx.h"
#include"Shape.h"
#include<string>
#include <iostream>
using namespace std;
int main()
{ int r=3;
int w=5,h=8;
int m_r=r;
int m_w=w;
int m_h=h;
Circle circle(r);
Rectangle rectangle(w,h);
cout<<"圆的面积为:"<<circle.area<<endl
<<"圆的周长为:"<<circle.perimeter<<endl
<<"矩形的面积为:"<<rectangle.area<<endl
<<"矩形的周长为:"<<rectangle.perimeter<<endl;
return 0;
}
//Shape.cpp
#include"stdafx.h"
#include"Shape.h"
using namespace std;
Circle::Circle( int r)
{ m_r=r;}
void Circle::GetArea()
{ int PI=3;
double area=PI*m_r*m_r;}
void Circle::GetPerimeter()
{ int PI=3;
double perimeter=2*PI*m_r;}
ostream &operator<<( ostream &output,
const Circle &C)
{
output << "面积为:" << C.area << "周长为:" << C.perimeter;
return output; }
Circle&Circle:: operator=( Circle& C)
{ int r=0;
if(&C!=this)
{ C.m_r=r; }
return *this; }
Rectangle::Rectangle(int w,int h)
{m_w=w;
m_h=h;}
void Rectangle::GetArea()
{ double area=m_w*m_h;}
void Rectangle::GetPerimeter()
{ double perimeter=2*m_w+2*m_h;}
ostream &operator<<( ostream &output,
const Rectangle&R)
{
output << "面积为:" << R.area << "周长为:" << R.perimeter;
return output; }
Rectangle&Rectangle::operator=(Rectangle &R)
{int w=0,h=0;
if(&R!=this)
{R.m_h=h;
R.m_w=w;}
return *this;}
void ShapeArea(Shape &s)
{ s.GetArea();}
void ShapePerimeter(Shape &s)
{ s.GetPerimeter();}
原因是,你在实现GetArea,GetPerimeter的时候,都重新在函数内新声明了一个变量double area = ...;double perimeter = ...;
你本意是修改类内public double area, perimeter的值,但是在这里因为double area = ...;,将计算的所得值赋给了一个函数内的局部变量,所以算半天还是初始值。
另外,记得在main()函数里面调用
Circle circle = Circle(r);
circle.GetArea();
circle.GetPerimeter();
Rectangle rectangle = Rectangle(w, h);
rectangle.GetArea();
rectangle.GetPerimeter();
以计算需要的数值。
我将你的代码进行了修改,在我本机上运行是没问题的。
代码我贴到这里了:
main文件:https://paste.ubuntu.com/p/T2T9QBS7P9/
.h头文件:https://paste.ubuntu.com/p/sQNJFR538H/
shape.cpp文件:https://paste.ubuntu.com/p/9z74jvxdXh/