zbdn 2021-02-18 23:52 采纳率: 64.3%
浏览 65
已采纳

为什么无法获得正确的面积和周长

//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();}
  • 写回答

1条回答 默认 最新

  • ProfSnail 2021-02-19 01:00
    关注

    原因是,你在实现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/

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 用AT89C52单片机设计一个温度测量与控制电路
  • ¥15 无法import pycausal
  • ¥15 VS2022创建MVC framework提示:预安装的程序包具有对缺少的注册表值的引用
  • ¥15 weditor无法连接模拟器Local server not started, start with?
  • ¥20 6-3 String类定义
  • ¥15 嵌入式--定时器使用
  • ¥20 51单片机学习中的问题
  • ¥30 Windows Server 2016利用兩張網卡處理兩個不同網絡
  • ¥15 Python中knn问题
  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库