Я выяснил большую часть кода / назначения, вот часть «To-Do», которую я не могу понять:
Вот мой код (в основном ничего нельзя изменить):
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
const double PI = 3.14159265359;
class Geometry
{
public:
Geometry(std::string name)
:m_name(name)
{
}
virtual double computeVolume() = 0;
virtual double computeSurfaceArea() = 0;
std::string getName() { return m_name; }
std::string getType() { return m_type; }
protected:
std::string m_name;
std::string m_type;
};
class Box : public Geometry
{
public:
Box(std::string name, double length, double width, double height)
: Geometry(name), m_length(length), m_width(width), m_height(height)
{
}
virtual double computeSurfaceArea()
{
return (2 * (m_height * m_width)) + (2 * (m_height * m_length)) + (2
* (m_length * m_width));
}
virtual double computeVolume()
{
return m_length * m_width * m_height;
}
protected:
double m_length;
double m_width;
double m_height;
};
class Sphere : public Geometry
{
public:
Sphere(std::string name, double radius)
:Geometry(name), m_radius(radius)
{
}
virtual double computeVolume()
{
return (4.0/3.0) * PI * (m_radius * m_radius * m_radius);
}
virtual double computeSurfaceArea()
{
return 4 * PI * (m_radius * m_radius);
}
protected:
double m_radius;
};
void report(Geometry* obj)
{
std::cout << "----- Geometry Report -----" << std::endl << std::endl
<< "Type: " << obj->getType() << std::endl
<< "Name: " << obj->getName() << std::endl
<< "Volume " << obj->computeVolume() << std::endl
<< "Surface Area " << obj->computeSurfaceArea() << std::endl <<
std::endl;
}
int main()
{
std::vector<Geometry*> items;
items.push_back(new Box("Box 1", 1, 2, 3));
items.push_back(new Box("Box 2", 2, 3, 4));
items.push_back(new Sphere("Sphere 1", 5));
items.push_back(new Sphere("Sphere 2", 6));
for (int i = 0; i < items.size(); i++)
{
report(items[i]);
}
system("PAUSE");
return 0;
}
Спасибо
Если я правильно понимаю ваш вопрос, то вам просто нужно установить m_type
переменная непосредственно в конструкторе каждого из ваших производных классов. Вы можете сделать это, потому что эта переменная имеет protected
доступ, что означает, что производные классы могут манипулировать им напрямую. Так что вы должны просто быть в состоянии сделать:
Box(std::string name, double length, double width, double height)
: Geometry(name), m_length(length), m_width(width), m_height(height)
{
m_type = "Box type";
}
Защищенная переменная-член или функция очень похожи на закрытый член, но она предоставляет одно дополнительное преимущество, заключающееся в том, что к ним можно получить доступ в дочерних классах, которые называются производными классами.
Таким образом, вы можете напрямую установить m_type из производного класса.
Пример::
class Box {
protected:
double width;
};
class SmallBox:Box { // SmallBox is the derived class.
public:
void setSmallWidth( double wid );
double getSmallWidth( void );
};
// Member functions of child class
double SmallBox::getSmallWidth(void) {
return width ;
}
void SmallBox::setSmallWidth( double wid ) {
width = wid;
}
// Main function for the program
int main() {
SmallBox box;
// set box width using member function
box.setSmallWidth(5.0);
cout << "Width of box : "<< box.getSmallWidth() << endl;
return 0;
}
В вашем случае это может быть использовано так
Box(std::string name, double length, double width, double height)
: Geometry(name), m_length(length), m_width(width), m_height(height)
{
m_type="abc";
}