Не совсем понимаю, как должны прописываться классы-группы?

Не совсем понимаю, как должны прописываться классы-группы? С обычными классами понятно, но вот как сделать класс-группу(объект класса может добавлять в себя другие объекты) пока не понимаю, помогите, я новичок в с++.

вот иерархия классов: Division, first, second - "классы-группы", в объект класса-группы нужно уметь добавлять объекты класса soldier.

введите сюда описание изображения

из классов-групп прописан только заголовочный файл Division.h

Код программы:

Object.h:

class Object
{
public:
    virtual void Show()=0;
};

Person.h:

#pragma once
#include "Object.h"
#include <iostream>
#include <cstring>
using namespace std;
class Person : public Object
{
protected:
    string name;

public:
    Person();
    Person(string name);
    ~Person();
    virtual void show();
};

Soldier.h

#pragma once
#include "Person.h"
class Soldier : protected Person
{
public:
    Soldier(string Name);
    ~Soldier();
    void show();    
};

Soldier.cpp:

#include "Soldier.h"

void Soldier::show()
{
    cout << "Soldier: " << name << endl;
}

Soldier::Soldier(string Name)
{
    name = Name;
}

Soldier::~Soldier()
{
}

Division.h:

#pragma once
#include "Object.h"
#include "Person.h"

struct List
{
    Object* List;
    List* next;
};

class Division : public Object
{
protected:
    string name;
    Person* head; 
    List* begin; 
public:
    Division(string, Division*);
    Division(Division&);
    ~Division();
    Person* GetHead();
    void SetName(string Name);
    void  SetHead(Person* p);
    void Insert(Object* p);
    virtual void Show() = 0;
};

Ответы (1 шт):

Автор решения: Rikitikitavi

Можно примерно так сделать:

 class Division : public Object
 {
 protected:
    string _name;
    Comander* _comanser;
    list<Person*> _persons;
public:
    Division(string name);
    Division(Division&);
   ~Division();
    Comander* GetHead();
    void SetName(string name);
    void  SetHead(Comander* comander)
    {
        _comander = comander;
    }
    void addPerson(Person* p)
    {
        _persons.push_back(p);
    }
    virtual void Show()
    {
          cout << "Division: " << name << endl;
          for (auto person: _persons)
               person->Show();
    }
    virtual build() = 0;     
 };


 class FirsDivision : public Division
 {
public:
    FirsDivision (string name):Division(name){}
   ~FirsDivision ();
    virtual build()
    {
       _comander = new Comander;
       _person.push_back(new Soldier);
       _person.push_back(new Soldier);
    }
 };

 class SecondDivision : public Division
 {
public:
    FirsDivision (string name):Division(name){}
   ~FirsDivision ();
    virtual build()
    {
       _comander = new Comander;
       _person.push_back(new Comander);
       _person.push_back(new Comander);
    }
 };

Метод Show определить в классе Division и в нем же добавить новый абстрактный метод build который будет заполнять Division, и определять его в производных классах, меняя логику заполнения.

→ Ссылка