回 帖 发 新 帖 刷新版面

主题:[讨论]编译出现错误的一个简单程序

以下程序是先定义shape类 再派生circle和rectangle类 再有rectangle派生出squar类,可是编译时出现1.cpp
D:\c++\MSDev98\MyProjects\shap\1.cpp(35) : error C2228: left of '.getarea' must have class/struct/union type
D:\c++\MSDev98\MyProjects\shap\1.cpp(38) : error C2228: left of '.getarea' must have class/struct/union type
D:\c++\MSDev98\MyProjects\shap\1.cpp(41) : error C2228: left of '.getarea' must have class/struct/union type 错误。我想请教下哪位高手帮忙看看 因为我在主函数中已经定义了“s1”的类型了 为什么会出现如上错误 万分感谢!


#include<iostream.h>
#define  pi 3.14
class shape{
public: shape(){}
        ~shape(){cout<<"shape distruct"<<endl;}
        virtual double getarea(){return -1;}||*用于求面积函数*||
};
class circle:public shape{
public:
    circle(double radius){ itsradius=radius;}
    ~circle(){cout<<"circle distruct"<<endl;}
    double getarea(){return pi*itsradius*itsradius;}
private:
    double itsradius;   
};||*定义圆 并求其面积*||
class rectangle:public shape{
public:
    rectangle(double x,double y){width=x;length=y;}
    ~rectangle(){cout<<"rectangle distruct"<<endl;}
    double getarea(){ return width*length;}
private:
    double width,length;
};
class squar:public rectangle{
public:
    squar(double len);
    ~squar(){cout<<"squar distruct"<<endl;}
private:
    double len;
};
squar::squar(double len):rectangle(len,len){}
void main()
{ shape *s1;
  s1=new circle(5);
  s1.getarea();
  delete s1;
  s1=new rectangle(8.3,9.6);
  s1.getarea();
  delete s1;
  s1=new squar(2.5);
  s1.getarea();
  delete s1;
}

回复列表 (共5个回复)

沙发

shape *s1;
  s1=new circle(5);
  s1->getarea();
  delete s1;
  s1=new rectangle(8.3,9.6);
  s1->getarea();
  delete s1;
  s1=new squar(2.5);
  s1->getarea();
  delete s1;

既然是指针, 你为什么用 . ,应该用 -> 吧!

板凳

哦 原来如此 就是我想请教一下对于程序中的语句s1=new circle(5);有没有调用circle的构造函数 若有,那么为什么执行的时候没对它析构 谢谢!

3 楼

当然调用了构造函数啦!不然是无法执行 s1->getarea(); 构造函数初始化了虚函数指针(其实很多人都没有注意到这点)。

你要调用 delete s1; 这样才会析构

4 楼


delete 之后还要将该指针置空。

5 楼

~shape(){cout<<"shape distruct"<<endl;}
这个申明为virtual就可以对于程序中的语句s1=new circle(5);调用circle的析构函数了

我来回复

您尚未登录,请登录后再回复。点此登录或注册