C++ 在对象继承中构造对象后设置后续值

C++ 在对象继承中构造对象后设置后续值,c++,object,inheritance,polymorphism,C++,Object,Inheritance,Polymorphism,计算面积应该是所有形状所共有的,因此将computerea提升到基类中(可能使其抽象化)似乎是一个有效的解决方案。如果您的Square确实依赖于通过某人传递它自己的computerea()结果来设置它的面积,你的设计看起来不对 为什么不实现computeArea(),以便它设置对象上的区域并返回该区域 编辑 根据您更新的问题,为什么SetArea()会返回任何内容?实际上,根据声明,它没有,但它的定义有。只需完全放下SetArea()(从外部设置正方形的面积有什么意义?) class Squar

计算面积应该是所有形状所共有的,因此将
computerea
提升到基类中(可能使其抽象化)似乎是一个有效的解决方案。

如果您的
Square
确实依赖于通过某人传递它自己的
computerea()
结果来设置它的面积,你的设计看起来不对

为什么不实现
computeArea()
,以便它设置对象上的区域并返回该区域

编辑

根据您更新的问题,为什么
SetArea()
会返回任何内容?实际上,根据声明,它没有,但它的定义有。只需完全放下
SetArea()
(从外部设置正方形的面积有什么意义?)

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;
}

如果您确实只想在
Square
类中实现
setArea
,您可以
dynamic\u cast

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;
}
if(Square*s=dynamic\u castshape[0]){
s->setArea();
}

通常使用
dynamic\u cast
是糟糕设计的标志,在这种情况下,
Shape
为什么不实现
setArea()
,因为区域对于所有形状都是公共的。

显示正方形和形状类!如果在
inputdata()
方法中出现错误,则应使用
sqr=new Square(len,width,0)
,查看编译器生成的警告,它们不仅仅是为了让您烦恼。回到主题,向我们解释一下,为什么需要将
正方形
s保留在
形状
类型数组中。如果您想对这个数组使用
Square
特定的方法,您可以使用
Square*Square[100]数组。如果您想在那里保留另一个对象,为什么要使用仅对
Square
s可用的方法?这看起来像是设计问题,请为我们提供
Square
Shape
类,以便我们可以帮助您解决。是的,这就是我的建议。OTHH,你会考虑一个<代码>线<代码>一个代码>形状>代码>如果是,它的面积是什么?形状是2D对象——它有长度和宽度(因此面积)。一条线是一个1D对象——它只是有长度。对不起,我不知道你们在基类中托管computeArea是什么意思。我在类和形状类中都有computeArea,虚拟函数工作正常。假设我在shapeArray中有3个方形对象,形状[0],形状[1],形状[3],我计算了其中的3个。在my square.cpp中调用computeArea()后,立即将area设置为my area属性。程序是否能够验证区域属于哪个形状阵列?我想我需要形状[0]之类的东西。设置区域以正确输入每个数组的正确区域。@user2351750我假设该区域存储在
Square
的数据成员中。这意味着
Square
的每个实例都有自己的数据成员副本,并且它的成员函数
computerea()
将在其上运行。这些是C++中面向对象编程的基本知识;您可能需要阅读a以获得夹点。好的,在返回区域之前,我在computeArea()中的“区域属性”中设置了它。我得到了一个错误“void value未被忽略,因为运行时还没有开始,所以还没有进行计算,所以当我设置它时,我出现了这个错误。有什么方法可以忽略或避免这个错误吗?@user2351750您正在问有关未显示的代码的问题。添加
形状
正方形
计算区域()
setArea()
添加到您的问题中。@user2351750未添加到注释中。编辑您的问题以将代码放入其中。
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;
}
if ( Square *s = dynamic_cast<Square *>shape[0] ) {
  s -> setArea();
}