Для производного класса с конструктором, который принимает указатель базового класса, как мне обратиться к указателю базового класса?

Я работаю над заданием по абстрактным базовым классам для фигур. Для последнего раздела нам нужно написать класс, который является общей трехмерной версией любой из предыдущих двумерных фигур, например. площадь.

Итак, как вы можете видеть из моего кода ниже, его конструктор принимает указатель на базовый класс 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->getArea() или же shape*->getArea() но я просто получаю сообщения об ошибках «форма не относится к значению» и т. д.

Кто-нибудь может предложить некоторую помощь?

0

Решение

Форма — это тип класса, а не объект. Вы должны держать указатель на форму в вашем конструкторе. Это должно быть как:

Ваш ученик:

shape * theShape;

И ваш конструктор:

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

И ваш getVolume () должен выглядеть так:

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

Другие решения

Возможно, я неправильно читаю ваш вопрос, но вы, похоже, не используете shape*, Таким образом, вы можете добавить члена в свой класс:

shape* s_;

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

А потом позвони s_->getArea(),

0

Да, извините, это был довольно глупый вопрос, но я легко догадался, что это простая ошибка. Как вы говорите, мне нужно было добавить shape* как член моего класса призмы, который я мог бы затем сослаться в моем конструкторе. Для любого, кто сталкивается с подобной путаницей, вот то, что я считаю, что класс такого рода должен выглядеть!

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

};
0