-4

我对 C++ 相当陌生,我不确定如何正确地进行类型转换,或者我不确定如何在这种可能需要类型转换的方法中转换参数。

我有一个函数 getRadius

double Circle_getRadius(Circle* _this)
{
    return _this->radius;
}

我想在 getArea 方法中使用 this 方法,如下所示

double Circle_area(Shape* _this)
{
    const double PI = 3.1415927;
    double radi = Circle_getRadius;
    return PI *  radi * radi;
}

我在 Circle_getRadius 下收到一个错误,提示“错误:“double( )(Circle _this)”类型的值不能用于初始化“double”类型的实体。这是什么意思?

我也尝试过这个错误

double Circle_area(Shape* _this)
{
    const double PI = 3.1415927;
    return PI *  radius * radius;
}

半径在哪里得到错误“错误:标识符“半径”未定义。有什么建议吗?

4

4 回答 4

5

这与铸造无关。(无论如何,您通常不应该投射任何东西。)

您忘记了函数调用括号和参数:

double radi = Circle_getRadius(_this);
//                            ^^^

(函数名本身也是一个值,但它的类型是函数指针类型,即 type double (*)(Circle *)。)

这假设 aShape*可转换为 a Circle*,这似乎不太可能。您可以将一个转换为另一个(通过说static_cast<Circle*>(_this),并假设它Circle(非虚拟地)派生自Shape),但正如我所说,您通常不应该这样做,而且它可能不正确。

于 2013-05-24T22:06:23.677 回答
5

对此的实际解决方案是拥有一个类层次结构,其中虚函数GetArea知道如何计算对象本身的大小。

在正方形或三角形上得到 是没有意义的radius,计算圆形、三角形或正方形的面积都是不同的。

class Shape
{
  public:
   virtual double GetArea() = 0; 
};

class Circle: public Shape
{ 
  private:
    double radius;
  public:
    Circle(double r) : radius(r) {}
    double GetArea() { return radius * radius * PI; }
};

class Square : public Shape
{
  private:
    double side;
  public:
    Square(double s) : side(s) {}
    double GetArea() { return side * side; }
};

...我会让你弄清楚如何做一个三角形、矩形、省略号等。

然后我们可以做这样的事情:

Shape& x = Circle(3.5)
Shape& y = Square(5);

cout << x.GetArea() << " " << y.GetArea() << endl;

您的代码看起来有点像您期望 C++ 像 Python 或 PHP 一样运行,其中对对象的函数调用在运行时得到解决。在 C++ 中,编译代码时对象必须存在函数。

于 2013-05-24T22:24:01.473 回答
1
double radi = Circle_getRadius;

应该

double radi = Circle_getRadius(_this);
//                                                    ^^^^^^^

您忘记调用该函数。

于 2013-05-24T22:06:51.463 回答
1
 double radi = Circle_getRadius;

不是函数调用,你必须指定参数传递给被调用函数。

double radi = Circle_getRadius(_this); //assume Shape is subclass of circle
于 2013-05-24T22:07:03.510 回答