C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
метод, вызывающий конструкторы, для элементов вектора
kea
Отправлено: 18.01.2006, 19:02


Станционный диспетчер

Группа: Участник
Сообщений: 80



Здравствуйте!
Создал класс-контайнер:
CODE

template <class T>
class MyContainer
{

public:
 MyContainer(void) : FtermsCount(0) { };
 MyContainer( const int NewTermsCount );

 ~MyContainer() { FTerms.clear() };

private:
 int FTermsCount;
 vector<T*> FTerms;

};

template <class T>
MyContainer<T>::MyContainer( const int NewTermsCount )
{

 FtermsCount = NewTermsCount;
 Fterms.resize( FTermsCount );

}


Как написать конструктор или метод Create для класса MyContainer, который выделял память для каждого элемента вектора, вызывая для него свой конструктор (например, в моем случае в качестве T м.б. два класса C1 — конструктор с одним параметром типа int и C2 — конструктор с двумя параметрами типа int)?

Не хотелось бы писать отдельно реализации методов:
для класса C2
CODE

template <class T>
 void MyContainer<T>::Create( const int P1, const int P2 )
{

 for ( int i = 0; i < FtermsCount; i ++ )
 FTerms[ i ] = new T( P1, P2 );

}


для класса C1
CODE

template <class T>
 void MyContainer<T>::Create( const int P1 )
{

 for ( int i = 0; i < FtermsCount; i ++ )  
 FTerms[ i ] = new T( P1 );

}


Как то это не гибко и не согласуется с ООП. Подскажите альтернативный вариант.
Думается, что удобнее передавать в этот метод укзатель на нужный конструктор со своим набором параметров — подскажите как?
Asher
Отправлено: 18.01.2006, 19:21


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Вызывать конструктор копирования.
kea
Отправлено: 19.01.2006, 00:13


Станционный диспетчер

Группа: Участник
Сообщений: 80



QUOTE (Asher @ 18/01/2006, 19:21)
Привет.
Вызывать конструктор копирования.

Здравствуйте!
А можно пример кода для моего примера (извиняюсь за тавтологию), чтобы окончательно разобраться?
Asher
Отправлено: 19.01.2006, 10:14


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
QUOTE
А можно пример кода для моего примера (извиняюсь за тавтологию), чтобы окончательно разобраться?

Можно.
CODE
template <class T>
void MyContainer<T>::Create( T& src )
{

for ( int i = 0; i < FtermsCount; i ++ )
FTerms[ i ] = new T( src );

}

Вызывать так:
CODE
Create(C1(P1));

или соответственно
CODE
Create(C2(P1,P2));


При этом создается 1 временный объект, потом FtermsCount раз вызывается конструктор копирования. При выходе временный объект уничтожается.
kea
Отправлено: 19.01.2006, 18:02


Станционный диспетчер

Группа: Участник
Сообщений: 80



Здравствуйте! Классно! Спасибо!

Вернуться в Вопросы программирования в C++Builder