Как вы устанавливаете строковый элемент данных из базового класса, с производным классом?

Я выяснил большую часть кода / назначения, вот часть "To-Do", которую я не могу понять:

  • Производные классы устанавливают m_type, но обратите внимание, что для этого нет функции setType (и вы не можете добавить ее).

Вот мой код (в основном ничего нельзя изменить):

#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;
}

Спасибо

2 ответа

Если я правильно понимаю ваш вопрос, то вам просто нужно установить 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";
}
Другие вопросы по тегам