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

Вопрос: как передать шаблонному классу параметры, которые понадобятся при создании Accepter, если такое возможно?
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #34714159
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Передать через полиморфный Хранитель.
2) Accepter сделать Прототипом.
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #34714160
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3) В шаблоне сделать Фабричный метод.
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #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
вопрос по шаблонам
    #34714205
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikможно чуть прояснить? дело в том, что я с шаблонами еще толком не работал. Сейчас пришла мысль сделать класс, для автоматического гарантированного удаления динамически выделенного объекта при выходе его из зоны видимости, т.е. что-то вроде такого:


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

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

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


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

m_pObj = ptr;
}
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #34714503
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
вопрос по шаблонам
    #34714522
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если я подобным образом перегружу new, то конструторы объектов разве будут вызываться как при стандартном new?
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #34714554
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikесли я подобным образом перегружу new, то конструторы объектов разве будут вызываться как при стандартном new?

Да. А куда они денуться с подводной лодки?
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #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
вопрос по шаблонам
    #34714568
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да ещё не забыть про массивы и delete тоже
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #34714569
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
вопрос по шаблонам
    #34714581
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а исключениям, мне каатся, по-барабану, откуда их выбросили ;), равно как и обработчику их, разве нет?
...
Рейтинг: 0 / 0
вопрос по шаблонам
    #34714648
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychа исключениям, мне каатся, по-барабану, откуда их выбросили ;), равно как и обработчику их, разве нет?

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

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

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

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

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

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


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

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


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


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

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

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


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