| Код | #include <iostream> #include <string> #include <list> #include <algorithm> #include <memory>
class MyObject { public: void Scan() { std::cin >> value; }
void Print() const { std::cout << value; }
private: std::string value; };
MyObject ** MakeBuffer(size_t size) { MyObject ** buffer = new MyObject * [size]; ::memset(buffer, 0, sizeof(MyObject *) * size); return buffer; }
void DropBuffer(MyObject ** buffer, size_t size) { std::for_each(&buffer[0], &buffer[size - 1], [](MyObject * obj) { delete obj; }); delete [] buffer; }
int main() { const size_t size = 4; MyObject ** buffer = MakeBuffer(size); std::list<MyObject *> objects;
for(size_t i = 0; i < size; ++i) { MyObject * obj = new MyObject(); std::cout << "Type value for object number " << i << ": "; obj->Scan(); buffer[i] = obj; objects.push_back(obj); }
std::for_each(objects.begin(), objects.end(), [](MyObject * obj) { obj->Print(); std::cout << std::endl; });
DropBuffer(buffer, size);
::system("PAUSE"); return 0; }
|
Как-то так. Лямбды и for_each можно заменить на старый добрый for по итераторам, если юзаешь C++ отличный от прошлогоднего стандарта.
Можно обойтись и без массива, тогда указатель в листе будет единственным на объект и его важно будет не потерять.
| Код | #include <iostream> #include <string> #include <list> #include <algorithm>
class MyObject { public: void Scan() { std::cin >> value; }
void Print() const { std::cout << value; }
private: std::string value; };
int main() { const size_t size = 4; std::list<MyObject *> objects;
for(size_t i = 0; i < size; ++i) { MyObject * obj = new MyObject(); std::cout << "Type value for object number " << i << ": "; obj->Scan(); objects.push_back(obj); }
std::for_each(objects.begin(), objects.end(), [](MyObject * obj) { obj->Print(); std::cout << std::endl; });
std::for_each(objects.begin(), objects.end(), [](MyObject * obj) { delete obj; });
::system("PAUSE"); return 0; }
|
Если лямбды совсем не понятны, то второй вариант без них будет выглядить так
| Код | #include <iostream> #include <string> #include <list>
class MyObject { public: void Scan() { std::cin >> value; }
void Print() const { std::cout << value; }
private: std::string value; };
int main() { const size_t size = 4; std::list<MyObject *> objects;
for(size_t i = 0; i < size; ++i) { MyObject * obj = new MyObject(); std::cout << "Type value for object number " << i << ": "; obj->Scan(); objects.push_back(obj); }
for(std::list<MyObject *>::const_iterator it = objects.begin(); objects.end() != it; ++it) { (*it)->Print(); std::cout << std::endl; }
for(std::list<MyObject *>::const_iterator it = objects.begin(); objects.end() != it; ++it) { delete (*it); }
::system("PAUSE"); return 0; }
|
Если между последними двумя циклами ничего делать не нужно, их можно объединить. |