2017-01-13 5 views
0

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

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

Использования 'статического станда :: список вещей;', вам не нужно будет передать указатель на объект , –

+0

может иметь 'void addThing (int howMuch);' function в вашем списке – tinkertime

+0

Вы имели в виду 'std :: list things;' вместо 'std :: list things;'? Обратите внимание на добавленный '*'. –

ответ

0

Вы можете сохранить созданные элементы внутри самой вещи класса с помощью статического поля _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; 
} 
+0

Этот и оригинальный пример столкнутся с большими проблемами, как только любая вещь будет уничтожена. Он работает только для самых простых сценариев. –

+0

@ François Andrieux, для 'Thing', поскольку он определен в настоящее время, я не вижу, как мы можем столкнуться с проблемами. Я полагаю, что проблемы, которые вы имели в виду, использовали объект после его уничтожения. Но 'Thing' не содержит полей, требующих передачи прав собственности. В зависимости от того, как мы хотим изменить «Вещь» и как отслеживать экземпляры, мы можем либо сделать специальные копии «Thing's», либо «Thing's», которые были уничтожены из списка. – Max

+0

@Max, спасибо! @Francois, ваше решение этих «больших проблем» разрешено с помощью указателя '', о котором вы упомянули в своем предыдущем комментарии? – Ben

Смежные вопросы