|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » ?* Теория *? Очередные хитрые вопросы по C++ |
|
?* Теория *? Очередные хитрые вопросы по C++
|
![]() Ветеран Сообщения: 1180 |
Дабы сэкономить код я написал такую хитрую вещь:
Компилятор не ругался, но должного эффекта не получилось. Кто из нас неправ? |
|
Отправлено: 14:00, 04-05-2005 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать У меня ругается. gcc 3.4.2. Зато
вполне работает. Честно говоря, не знаю почему, просто где-то давно вычитал.
А ещё бы я забил на std::auto_ptr и использовал более умный указатель и не мучался. Что-нибудь из boost (shared_ptr?) по идее можно выдрать, или свой на коленке сваять. |
------- Отправлено: 16:34, 04-05-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать А мне std::auto_ptr нравится. В примере, правда, он только для того, чтобы показать передачу владения классом. С поправкой, пожалую согласен.
|
Отправлено: 12:44, 12-05-2005 | #3 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать gcc, c++ 3.3.2; компилится, но не работает. Если вас не затруднит, попробуйте этот код:
#include <iostream> #include <memory> #include <vector> #include <algorithm> #include <functional> using namespace std; // gcc -o test-1 test.cpp /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/libstdc++.so class A { int fvalue; static int ginstance_count; public: A() : fvalue(0) { ++A::ginstance_count; cout << "A::A()" << endl; } ~A() { --A::ginstance_count; cout << "A::~A()" << endl; } static void leakReport() { cout << ginstance_count << " instances alive" << endl; } }; int A::ginstance_count(0); class List { bool fuse_for_each; vector<A*> flist; public: List(bool b) : fuse_for_each(b) { } ~List() { if (fuse_for_each) { for_each(flist.begin(), flist.end(), ptr_fun(operator delete)); } else { while (!flist.empty()) { delete flist.back(); flist.pop_back(); } } cout << "List::~List result: "; A::leakReport(); } void add(auto_ptr<A> pa) { flist.push_back(pa.release()); } }; int main(int argc, char*argv[]) { cout << "Entering the block (using for_each)" << endl; { List list(true); list.add(auto_ptr<A>(new A())); list.add(auto_ptr<A>(new A())); list.add(auto_ptr<A>(new A())); } cout << "Left the block" << endl; cout << "Entering the block (well-working code)" << endl; { List list(false); list.add(auto_ptr<A>(new A())); list.add(auto_ptr<A>(new A())); list.add(auto_ptr<A>(new A())); } cout << "Left the block" << endl; } [andrey@localhost bin]$ test-1 Entering the block (using for_each) A::A() A::A() A::A() List::~List result: 3 instances alive Left the block Entering the block (well-working code) A::A() A::A() A::A() A::~A() A::~A() A::~A() List::~List result: 3 instances alive Left the block единственный статический оператор, определённый для всех классов автоматически, причём класс идентифицируется по аргументу-указателю. Непонятно, что означает фраза ptr_fun(operator delete), т.е. &(operator delete). Для чьёго оператора берётся адрес? List: ![]() ![]() деструктор? Непонятно, почему это откомпилировалось... |
Отправлено: 13:31, 17-05-2005 | #4 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Очередные мошенники | Jamgar | Мобильные ОС, смартфоны и планшеты | 4 | 28-08-2011 12:35 | |
Очередные сроки выхода Windows 7 | OSZone News | Новости и события Microsoft | 9 | 29-05-2009 10:05 | |
*Теория* | Вопросы по синтаксису языка Си. Знак модуля. | Hemp | Программирование и базы данных | 5 | 31-10-2005 12:47 | |
очередные проблемы с ХР | Pierre | Microsoft Windows 2000/XP | 14 | 11-02-2003 14:52 | |
"Хитрые" картинки | Vadikan | Вебмастеру | 5 | 17-11-2002 01:56 |
|