【问题标题】:For a derived class with a constructor that takes a base class pointer, how do I refer to the base class pointer?对于带有带有基类指针的构造函数的派生类,如何引用基类指针?
【发布时间】:2014-04-27 19:38:52
【问题描述】:

我正在处理关于形状的抽象基类的任务。对于最后一部分,我们需要编写一个类,它是任何先前 2D 形状的通用 3D 版本,例如。正方形。

从下面的代码中可以看出,它的构造函数采用基类指针shape*。在我的函数“getVolume”中,我基本上需要将z 乘以shape* 指向的形状的面积,这可以通过函数getArea() 来计算,该函数在每个形状各自的类中指定。但是我指的是被指向的形状吗?

class prism : public square, public rectangle, public circle {
private:
    double z;
public:
    prism(){z=0;}
    prism(shape*, double a){z=a;}
    ~prism(){cout<<"Prism destructor called"<<endl;}

    //Access functions
    void print_(){cout<<"Prism with length = "<<z;}
    double getLength(int n)const{ return z; }
    void setLength(double a){z=a;}

    //Other functions
    double getVolume(){ return ??????????;}

    };

如何引用指向的形状?我希望它会是 this-&gt;getArea() 或 shape*-&gt;getArea() 之类的东西,但我只是收到错误消息,告诉我“形状不代表值”等。

谁能提供一些帮助?

【问题讨论】:

    标签: c++ pointers derived-class abstract-base-class


    【解决方案1】:

    shape 是类类型而不是对象。您应该在构造函数中保留指向形状的指针。应该是这样的:

    你的班级成员:

    shape * theShape;
    

    还有你的构造函数:

    prism(shape* sh, double a)
    {
        z=a;
        theShape =sh;
    }
    

    你的 getVolume() 应该是这样的:

    double getVolume(){ return theShape->getArea()*z;}
    

    【讨论】:

      【解决方案2】:

      我可能读错了您的问题,但您似乎没有使用shape*。所以你可以在你的班级中添加一个成员:

      shape* s_;
      
      prism(shape* s, double a) s_(s) ...
      

      然后拨打s_-&gt;getArea()。

      【讨论】:

        【解决方案3】:

        是的,抱歉,这是一个相当愚蠢的问题,但我猜是一个容易犯的错误。正如你所说,我需要添加一个 shape* 作为我的 prism 类的成员,然后我可以在我的构造函数中引用它。对于任何遇到类似困惑的人来说,我认为这类类应该是这样的!

        class prism : public ...(reference 'shapes')..... {
        private:
            double z;
            shape* s;
        public:   
            prism(shape* s_, double a){z=a; s=s_;}
        
            double doSomethingToShape(){return s->doSomething();}
        
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-12
          • 1970-01-01
          • 2015-06-11
          • 1970-01-01
          • 2017-07-18
          • 2023-03-22
          • 1970-01-01
          相关资源
          最近更新 更多