Конструктор для добавления каждого экземпляра класса в объект списка

Новый для c++ и OOP. Я пытаюсь выяснить списки и итерации, поэтому я создал следующий пример кода. Я создаю пару объектов вещи, но я хочу убедиться, что когда вещь создана, ее конструктор добавляет ее в список «вещи» (внутри объекта списков), чтобы я мог отслеживать каждый экземпляр вещи. В нижней части main() я затем повторяю список вещей. Есть ли лучший способ сделать это, или вы можете указать, как это сделать в my Thing constructor? Спасибо!!

#include <iostream>
#include <list>

class Thing;

class Lists
{
public:
    std::list<Thing> things;
    Lists() {
        std::cout << "List object with list 'things' created" << std::endl;
    }
};

class Thing
{
public:
    int howMuch, pointer;
    Thing(int x, Lists* y)
    {
        howMuch = x;
        y->things.push_back(this);
    }
};

int main()
{

    //create the object that holds the list of things
    Lists lists;

    //make some objects, and pass a pointer of the lists to the constructor
    Thing thingA(123, &lists);
    Thing thingB(456, &lists);

    for (std::list<Thing>::iterator it = lists.things.begin(); it != lists.things.end(); ++it)
        std::cout << "test" << it->howMuch << std::endl;

    return 0;
}

1 ответ

  1. Созданные элементы можно хранить внутри самого класса Thing с помощью статического поля _things:

    #include <iostream>
    #include <list>
    
    class Thing
    {
        static std::list<Thing> _things;
    
    public:
        int howMuch, pointer;
        Thing(int x) : howMuch(x)
        {
            _things.push_back(*this);
        }
    
        static std::list<Thing> getAllThings()
        {
            return _things;
        }
    };
    
    
    std::list<Thing> Thing::_things;
    
    int main()
    {
        Thing thingA(123);
        Thing thingB(456);
    
        auto allThings = Thing::getAllThings();
    
        for (auto it = allThings.begin(); it != allThings.end(); ++it)
            std::cout << "test " << it->howMuch << std::endl;
    
        return 0;
    }