0
Shape *shape[100];
Square sqr;

void inputdata() {
int len,width;
cout << "enter length";
cin >> len;
cout << "enter width";
cin >> width;

sqr = Square(len,width,0); //---> i have not compute area for this, i just put a 0 for it first     
shape[0] = &sqr;
}

void computeArea() {
int area;
area = shape[0]->computeArea();
//----> need to set my area here after getting it
}

shape 是父类,square 是子类

创建方形对象并将其插入形状数组后。我无法在我的 square 类中使用 setArea() 方法来设置区域。

我已经为此找到了两个解决方案,但觉得它不适合对象继承多态性。

一种方法是在 shape 类中实现 setArea()(我已经在 square 类上设置了 setArea())并通过多态性调用 setArea 方法并将其设置为我的正方形区域属性。

另一种方法是在形状类中创建一个 get 对象方法,即 getSquare(),这样我就可以通过 Shape 数组到达 getArea() 方法

我的两种方法有效吗?或者有更好的方法吗?

class Square: public Shape{

private:
int len;
int width;
int area;

public:
Square(string,int,int,int);
int getArea();
void setArea(int);
};

int Square::computeArea() {
int sqrArea = len*width;
area = setArea(sqrArea);
return sqrArea;
}

int Square::setArea(int _area) {
area = _area;
}
4

3 回答 3

1

计算区域应该是所有形状共有的东西,因此提升computeArea到基类(并可能使其抽象)似乎是一个有效的解决方案。

于 2013-05-08T14:30:57.487 回答
0

如果你真的只想setAreaSquare课堂上实现,你可以dynamic_cast

if ( Square *s = dynamic_cast<Square *>shape[0] ) {
  s -> setArea();
}

通常使用dynamic_cast是糟糕设计的标志,在这种情况下为什么不Shape实施setArea(),因为区域对所有形状都是通用的。

于 2013-05-08T14:37:43.337 回答
0

如果你Square真的依赖于让某人通过它自己的结果来设置它的区域computeArea(),那么你的设计看起来是错误的。

你为什么不实现computeArea()它来设置对象上的区域并返回它?

编辑

根据您更新的问题,为什么会SetArea()返回任何内容?实际上,根据声明,它没有,但它的定义确实如此。完全放下SetArea()(无论如何,从外面设置一个正方形的区域有什么意义?)并执行以下操作:

class Square: public Shape {

private:
  int len;
  int width;
  int area;

public:
  Square(string,int,int,int);
  int getArea();
};

int Square::computeArea() {
  area = len*width;
  return area;
}
于 2013-05-08T14:31:46.300 回答