Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по шаблонам / 25 сообщений из 25, страница 1 из 1
08.08.2007, 14:53
    #34714136
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Есть класс Accepter, который принимает в конструктор два параметра (пустого конструткора нету) и шаблонный класс ObjectPtr, который должен создать указатель на класс шаблона.

Вопрос: как передать шаблонному классу параметры, которые понадобятся при создании Accepter, если такое возможно?
...
Рейтинг: 0 / 0
08.08.2007, 14:57
    #34714159
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
1) Передать через полиморфный Хранитель.
2) Accepter сделать Прототипом.
...
Рейтинг: 0 / 0
08.08.2007, 14:59
    #34714160
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
3) В шаблоне сделать Фабричный метод.
...
Рейтинг: 0 / 0
08.08.2007, 15:03
    #34714184
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
можно чуть прояснить? дело в том, что я с шаблонами еще толком не работал. Сейчас пришла мысль сделать класс, для автоматического гарантированного удаления динамически выделенного объекта при выходе его из зоны видимости, т.е. что-то вроде такого:

Код: 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.
template <typename OT> class ObjectPtr
{
private:
	OT			*m_pObj;
public:

	// вернуть ссылку на объект
	OT			*Object()const						{ return m_pObj; }
	// вернуть ссылку на объект и прекратить контроль удаления
	OT			*ReleaseObject()const				
	{
		OT	*tmp = m_pObj;
		m_pObj = NULL;
		return tmp;
	}

	ObjectPtr(): m_pObj(NULL)
	{
		m_pObj = new OT;

		if (!m_pObj)		// есл вдруг исключение не выбросилось, то выбрасываю его
			throw std::bad_alloc;
	}

	~ObjectPtr()
	{
		delete m_pObj;
	}

}; // class ObjectPtr

все хорошо, пока не понадобилось создавать объекты с параметрами
...
Рейтинг: 0 / 0
08.08.2007, 15:09
    #34714205
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Tubrikможно чуть прояснить? дело в том, что я с шаблонами еще толком не работал. Сейчас пришла мысль сделать класс, для автоматического гарантированного удаления динамически выделенного объекта при выходе его из зоны видимости, т.е. что-то вроде такого:


std::auto_ptr<ClassName> чем не устраивает?
...
Рейтинг: 0 / 0
08.08.2007, 15:26
    #34714265
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
наверно можно и автоптр, его тоже еще не юзал, поэтому и не подумал, но у него может не быть строчки:

Код: plaintext
1.
2.
		if (!m_pObj)		// есл вдруг исключение не выбросилось, то выбрасываю его
			throw std::bad_alloc;

основной вопрос остается - как в автопрт создать объект с параметрами конструктора
...
Рейтинг: 0 / 0
08.08.2007, 15:34
    #34714296
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
1) Параметры можно передавать через объект, который унаследован от интерфейса, который их предоставляет. Для каждого объекта можно передать свой хранитель параметров. Создать хранитель можно в стеке и передавать по ссылке на базовый класс.
2) Объект имеет доступ к некоторому реестру где лежит готовый объект, созданный с нужными параметрами. Копируя этот объект имеем что надо.
3) От ObjectPtr отнаследовать класс, который будет принимать параметры где ему удобно, в данном случае в конструкторе. Вся функциональность, а именно, удаление, останется в базовом.
...
Рейтинг: 0 / 0
08.08.2007, 15:35
    #34714304
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Но, это только первые вариаты которые пришли. Может что-то и лучше можно придумать или модернизировать.
...
Рейтинг: 0 / 0
08.08.2007, 15:49
    #34714349
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Я так понимаю "прямого" простого метода нет, поэтому придется передавать в объект уже созданный указатель, тогда действительно лучше auto_ptr.
...
Рейтинг: 0 / 0
08.08.2007, 16:05
    #34714417
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
наверно тогда лучше так :)


ObjectPtr(OT *ptr)
{
if (!ptr) // есл вдруг исключение не выбросилось, то выбрасываю его
throw(std::bad_alloc());

m_pObj = ptr;
}
...
Рейтинг: 0 / 0
08.08.2007, 16:26
    #34714503
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
TubrikЯ так понимаю "прямого" простого метода нет, поэтому придется передавать в объект уже созданный указатель, тогда действительно лучше auto_ptr.

Подумай на счет перегрузки оператора new. По-моему можно и глобальный перегрузить. И сделай что-нить типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void *operator new(size_t size) {
...
    if (! ptr = ::new(size)) {
        throw ...
    }
...
};


Но, тут, действительно, надо будет много о чем подумать. О синтаксисе "::new" - не приведет ли это к рекурсии твоего оператора. Вообще о синтаксисе - я тут, наверное, ляпов понаделал (не занимался подобными вещами). Не забыть о перегрузке new[]. Ну, и т.д.
...
Рейтинг: 0 / 0
08.08.2007, 16:29
    #34714522
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
если я подобным образом перегружу new, то конструторы объектов разве будут вызываться как при стандартном new?
...
Рейтинг: 0 / 0
08.08.2007, 16:36
    #34714554
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Tubrikесли я подобным образом перегружу new, то конструторы объектов разве будут вызываться как при стандартном new?

Да. А куда они денуться с подводной лодки?
...
Рейтинг: 0 / 0
08.08.2007, 16:36
    #34714555
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Akh TubrikЯ так понимаю "прямого" простого метода нет, поэтому придется передавать в объект уже созданный указатель, тогда действительно лучше auto_ptr.

Подумай на счет перегрузки оператора new. По-моему можно и глобальный перегрузить. И сделай что-нить типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void *operator new(size_t size) {
...
    if (! ptr = ::new(size)) {
        throw ...
    }
...
};


Но, тут, действительно, надо будет много о чем подумать. О синтаксисе "::new" - не приведет ли это к рекурсии твоего оператора. Вообще о синтаксисе - я тут, наверное, ляпов понаделал (не занимался подобными вещами). Не забыть о перегрузке new[]. Ну, и т.д.
Не, по моему, так не взлетит. Придётся по-полной распределение памяти писать. ИМХО, может, лучше в классе определить свой оператор new? - попроще должно быть
...
Рейтинг: 0 / 0
08.08.2007, 16:39
    #34714568
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
да ещё не забыть про массивы и delete тоже
...
Рейтинг: 0 / 0
08.08.2007, 16:39
    #34714569
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
egorych AkhПодумай на счет перегрузки оператора new. По-моему можно и глобальный перегрузить. И сделай что-нить типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void *operator new(size_t size) {
...
    if (! ptr = ::new(size)) {
        throw ...
    }
...
};


Но, тут, действительно, надо будет много о чем подумать. О синтаксисе "::new" - не приведет ли это к рекурсии твоего оператора. Вообще о синтаксисе - я тут, наверное, ляпов понаделал (не занимался подобными вещами). Не забыть о перегрузке new[]. Ну, и т.д.
Не, по моему, так не взлетит. Придётся по-полной распределение памяти писать. ИМХО, может, лучше в классе определить свой оператор new? - попроще должно быть

Я тоже этого боюсь. Переопределение глобального оператора new сделает вызов ::new самого себя. :: - всего лишь область видимости, а не указание старого/нового оператора.

Но что мешает использовать malloc/free? Дополнение операторами delete/delete[]? Но это ничего сложного, главное их не забыть ввести.

На счет new класса - автор, вроде как, глобально хочеть получать исключения.
...
Рейтинг: 0 / 0
08.08.2007, 16:42
    #34714581
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
а исключениям, мне каатся, по-барабану, откуда их выбросили ;), равно как и обработчику их, разве нет?
...
Рейтинг: 0 / 0
08.08.2007, 16:57
    #34714648
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
egorychа исключениям, мне каатся, по-барабану, откуда их выбросили ;), равно как и обработчику их, разве нет?

Ну, так ClassA бросит исключение, а new int - не бросит.
...
Рейтинг: 0 / 0
08.08.2007, 17:10
    #34714700
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
ладно, фиг с ним со всем, сделаю по-простому,послений вопрос, если я перегружу примерно так:

void *operator new(size_t size) {
...
if (! ptr = ::new(size)) {
throw ...
}
...
};

мне кажется такое выделение памяти равносильно malloc в смысле невызова конструктора (если память для объекта), т.к. передается просто размер
если это так, то тогда как перегрузить new глобально, чтобы вызывался конструктор?
...
Рейтинг: 0 / 0
08.08.2007, 17:18
    #34714741
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Tubrikладно, фиг с ним со всем, сделаю по-простому,послений вопрос, если я перегружу примерно так:

void *operator new(size_t size) {
...
if (! ptr = ::new(size)) {
throw ...
}
...
};

мне кажется такое выделение памяти равносильно malloc в смысле невызова конструктора (если память для объекта), т.к. передается просто размер
если это так, то тогда как перегрузить new глобально, чтобы вызывался конструктор?

Конструктор вызывается всегда.
Но, у тебя, имхо он не вызовется, потомучто ты входишь в рекурсию. Вызов new из new плохая затея.
Делай malloc/free, если хочешь по простому, и к тому же тестовые примеры, что бы все становилось на свои места.
...
Рейтинг: 0 / 0
08.08.2007, 17:25
    #34714776
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
стало интересно, забрался в книжки, вот что вычитал :
MyClass * mc = new MyClass(); - называется new-выражение, при его выполнении происходят 2 вещи. во-первых выделяется пространство для объекта класса путём обращения к оператору new, во-вторых, вызывается конструктор. Так вот, возможно переопределить функцию operator new, но невозможно переопределить всё new-выражение ...
вывод - от переопределения оператора new не зависит способ обращения к конструктору (и деструктору, для delete)
...
Рейтинг: 0 / 0
08.08.2007, 17:27
    #34714784
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Akh
..что ты входишь в рекурсию. Вызов new из new плохая затея.


это уже понял, как-то сделал такую перегрузку - рекурсию

Akh
Конструктор вызывается всегда


а это не понял, malloc() не должен вызывать никаких конструкторов, разве не так?
...
Рейтинг: 0 / 0
08.08.2007, 17:33
    #34714814
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Tubrik
Akh
Конструктор вызывается всегда


а это не понял, malloc() не должен вызывать никаких конструкторов, разве не так?

new вызывает всегда. Читай пост от egorych.
...
Рейтинг: 0 / 0
08.08.2007, 17:35
    #34714822
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
пост появился пока я писал) всем спасибо
...
Рейтинг: 0 / 0
09.08.2007, 05:32
    #34715547
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по шаблонам
Tubrik wrote:

> оторый должен создать указатель на класс шаблона.
Указатель на класс шаблона нельзя взять по определению. Его не
существует как класс, он шаблон. Хотите взять указатель - типизируйте
шаблон.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос по шаблонам / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]