|
|
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Есть класс Accepter, который принимает в конструктор два параметра (пустого конструткора нету) и шаблонный класс ObjectPtr, который должен создать указатель на класс шаблона. Вопрос: как передать шаблонному классу параметры, которые понадобятся при создании Accepter, если такое возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 14:53 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
1) Передать через полиморфный Хранитель. 2) Accepter сделать Прототипом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 14:57 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
3) В шаблоне сделать Фабричный метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 14:59 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
можно чуть прояснить? дело в том, что я с шаблонами еще толком не работал. Сейчас пришла мысль сделать класс, для автоматического гарантированного удаления динамически выделенного объекта при выходе его из зоны видимости, т.е. что-то вроде такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. все хорошо, пока не понадобилось создавать объекты с параметрами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 15:03 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Tubrikможно чуть прояснить? дело в том, что я с шаблонами еще толком не работал. Сейчас пришла мысль сделать класс, для автоматического гарантированного удаления динамически выделенного объекта при выходе его из зоны видимости, т.е. что-то вроде такого: std::auto_ptr<ClassName> чем не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 15:09 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
наверно можно и автоптр, его тоже еще не юзал, поэтому и не подумал, но у него может не быть строчки: Код: plaintext 1. 2. основной вопрос остается - как в автопрт создать объект с параметрами конструктора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 15:26 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
1) Параметры можно передавать через объект, который унаследован от интерфейса, который их предоставляет. Для каждого объекта можно передать свой хранитель параметров. Создать хранитель можно в стеке и передавать по ссылке на базовый класс. 2) Объект имеет доступ к некоторому реестру где лежит готовый объект, созданный с нужными параметрами. Копируя этот объект имеем что надо. 3) От ObjectPtr отнаследовать класс, который будет принимать параметры где ему удобно, в данном случае в конструкторе. Вся функциональность, а именно, удаление, останется в базовом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 15:34 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Но, это только первые вариаты которые пришли. Может что-то и лучше можно придумать или модернизировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 15:35 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Я так понимаю "прямого" простого метода нет, поэтому придется передавать в объект уже созданный указатель, тогда действительно лучше auto_ptr. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 15:49 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
наверно тогда лучше так :) ObjectPtr(OT *ptr) { if (!ptr) // есл вдруг исключение не выбросилось, то выбрасываю его throw(std::bad_alloc()); m_pObj = ptr; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:05 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
TubrikЯ так понимаю "прямого" простого метода нет, поэтому придется передавать в объект уже созданный указатель, тогда действительно лучше auto_ptr. Подумай на счет перегрузки оператора new. По-моему можно и глобальный перегрузить. И сделай что-нить типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Но, тут, действительно, надо будет много о чем подумать. О синтаксисе "::new" - не приведет ли это к рекурсии твоего оператора. Вообще о синтаксисе - я тут, наверное, ляпов понаделал (не занимался подобными вещами). Не забыть о перегрузке new[]. Ну, и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:26 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
если я подобным образом перегружу new, то конструторы объектов разве будут вызываться как при стандартном new? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:29 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Tubrikесли я подобным образом перегружу new, то конструторы объектов разве будут вызываться как при стандартном new? Да. А куда они денуться с подводной лодки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:36 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Akh TubrikЯ так понимаю "прямого" простого метода нет, поэтому придется передавать в объект уже созданный указатель, тогда действительно лучше auto_ptr. Подумай на счет перегрузки оператора new. По-моему можно и глобальный перегрузить. И сделай что-нить типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Но, тут, действительно, надо будет много о чем подумать. О синтаксисе "::new" - не приведет ли это к рекурсии твоего оператора. Вообще о синтаксисе - я тут, наверное, ляпов понаделал (не занимался подобными вещами). Не забыть о перегрузке new[]. Ну, и т.д. Не, по моему, так не взлетит. Придётся по-полной распределение памяти писать. ИМХО, может, лучше в классе определить свой оператор new? - попроще должно быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:36 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
да ещё не забыть про массивы и delete тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:39 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
egorych AkhПодумай на счет перегрузки оператора new. По-моему можно и глобальный перегрузить. И сделай что-нить типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Но, тут, действительно, надо будет много о чем подумать. О синтаксисе "::new" - не приведет ли это к рекурсии твоего оператора. Вообще о синтаксисе - я тут, наверное, ляпов понаделал (не занимался подобными вещами). Не забыть о перегрузке new[]. Ну, и т.д. Не, по моему, так не взлетит. Придётся по-полной распределение памяти писать. ИМХО, может, лучше в классе определить свой оператор new? - попроще должно быть Я тоже этого боюсь. Переопределение глобального оператора new сделает вызов ::new самого себя. :: - всего лишь область видимости, а не указание старого/нового оператора. Но что мешает использовать malloc/free? Дополнение операторами delete/delete[]? Но это ничего сложного, главное их не забыть ввести. На счет new класса - автор, вроде как, глобально хочеть получать исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:39 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
а исключениям, мне каатся, по-барабану, откуда их выбросили ;), равно как и обработчику их, разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:42 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
egorychа исключениям, мне каатся, по-барабану, откуда их выбросили ;), равно как и обработчику их, разве нет? Ну, так ClassA бросит исключение, а new int - не бросит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 16:57 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
ладно, фиг с ним со всем, сделаю по-простому,послений вопрос, если я перегружу примерно так: void *operator new(size_t size) { ... if (! ptr = ::new(size)) { throw ... } ... }; мне кажется такое выделение памяти равносильно malloc в смысле невызова конструктора (если память для объекта), т.к. передается просто размер если это так, то тогда как перегрузить new глобально, чтобы вызывался конструктор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 17:10 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Tubrikладно, фиг с ним со всем, сделаю по-простому,послений вопрос, если я перегружу примерно так: void *operator new(size_t size) { ... if (! ptr = ::new(size)) { throw ... } ... }; мне кажется такое выделение памяти равносильно malloc в смысле невызова конструктора (если память для объекта), т.к. передается просто размер если это так, то тогда как перегрузить new глобально, чтобы вызывался конструктор? Конструктор вызывается всегда. Но, у тебя, имхо он не вызовется, потомучто ты входишь в рекурсию. Вызов new из new плохая затея. Делай malloc/free, если хочешь по простому, и к тому же тестовые примеры, что бы все становилось на свои места. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 17:18 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
стало интересно, забрался в книжки, вот что вычитал : MyClass * mc = new MyClass(); - называется new-выражение, при его выполнении происходят 2 вещи. во-первых выделяется пространство для объекта класса путём обращения к оператору new, во-вторых, вызывается конструктор. Так вот, возможно переопределить функцию operator new, но невозможно переопределить всё new-выражение ... вывод - от переопределения оператора new не зависит способ обращения к конструктору (и деструктору, для delete) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 17:25 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Akh ..что ты входишь в рекурсию. Вызов new из new плохая затея. это уже понял, как-то сделал такую перегрузку - рекурсию Akh Конструктор вызывается всегда а это не понял, malloc() не должен вызывать никаких конструкторов, разве не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 17:27 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Tubrik Akh Конструктор вызывается всегда а это не понял, malloc() не должен вызывать никаких конструкторов, разве не так? new вызывает всегда. Читай пост от egorych. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 17:33 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
пост появился пока я писал) всем спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 17:35 |
|
||
|
вопрос по шаблонам
|
|||
|---|---|---|---|
|
#18+
Tubrik wrote: > оторый должен создать указатель на класс шаблона. Указатель на класс шаблона нельзя взять по определению. Его не существует как класс, он шаблон. Хотите взять указатель - типизируйте шаблон. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 05:32 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34714648&tid=2028397]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
192ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 532ms |

| 0 / 0 |
