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 );
} |
Вызывать так:
или соответственно
При этом создается 1 временный объект, потом FtermsCount раз вызывается конструктор копирования. При выходе временный объект уничтожается.
|
|
kea |
Отправлено: 19.01.2006, 18:02 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 80
|
Здравствуйте! Классно! Спасибо! |
|