为什么我不能从double(C++中的点运算符)访问函数?

azpvetkf  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(123)

我的任务是练习继承,把所有的类放在单独的文件中。我有一个基类Circle和一个派生类Cylinder
我所坚持的是试图在屏幕上显示我对Cylinder类型的对象B计算的面积和体积的结果。我找到了一种方法来为Circle做这件事,尽管它对我的Cylinder不起作用。

circle.cpp

#include "circle.h"
#include <cmath>

using namespace std;

Circle Circle::area() {
    return M_PI * pow(r, 2);
}

void Circle::getArea() {
    cout << "Area = " << r << " m^2";
}

cylinder.cpp

#include "cylinder.h"
#include <cmath>

using namespace std;

double Cylinder::area() {
    return 2 * M_PI * r * h;
}

void Cylinder::getArea() {
    cout << "Area = " << h;
}

main.cpp

#include <iostream>
#include "circle.h"
#include "cylinder.h"

using namespace std;

int main() {
    Circle A;
    A.view();
    Circle A1(8);
    A1.view();
    
    Cylinder B;
    B.view();
    Cylinder B1(4, 6);
    B1.view();
    
    //A.area().getArea();
    //cout << endl;
        //A.circumference().getCircum();
        //cout << endl;
        //A1.area().getArea();
    //cout << endl;
        //A1.circumference().getCircum();
    
        B.area().getArea();

    return 0;
}

我得到的错误:

main.cpp: In function ‘int main()’:
main.cpp:26:14: error: request for member ‘getArea’ in ‘B.Cylinder::area()’, which is of non-class type ‘double’
   26 |     B.area().getArea();
      |              ^~~~~~~

我觉得我在main()中的代码(例如B)以及类Cylinder中的方法getArea()getVolume()都不正确。对于Circle类型的对象AA1,可能有更好的方法来做同样的事情,尽管我注解掉的代码实际上是有效的。
如果你能给我点建议我会很感激的。

aurhwmvo

aurhwmvo1#

那么,您收到错误消息的原因是:

main.cpp: In function ‘int main()’:
main.cpp:26:14: error: request for member ‘getArea’ in ‘B.Cylinder::area()’, which is of non-class type ‘double’
   26 |     B.area().getArea();
      |              ^~~~~~~

是因为你基本上是这样做的:

auto _ = B.area();

所以在这里,_推断为double,然后你这样做:

_.getArea();

您正在尝试从double访问成员函数,而double没有任何成员函数。
你可能想这样做:

auto x = B.area();
B.h = x;
B.GetArea();

这将B.area()的面积分配给变量x,并将x分配给B.h。然后调用B的成员函数并输出该区域。

dsekswqp

dsekswqp2#

getArea()函数中,不是说:

cout << "Area = " << endl;

就说:

cout << "Area = " << area() << endl;

然后在main.cpp中调用B.getArea()
希望这有帮助!

相关问题