Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача с двумя параметризованными классами 
:(
    Опции темы
AlexKar
Дата 7.12.2005, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 7.12.2005

Репутация: нет
Всего: нет



Как реализовать такую задачу?
Есть два параметризованных класса:
template <class T>
class A{
---------
private:
T width;
};
template <class T>
class B{
---------
private:
T width;
};

Надо перегрузить оператор присваивания таким образом, чтобы
можно было выполнить следующее:

int main(void);
/* T1 и T2 - определенные типы, например int и float */
A<T1> a;
B<T2> b;
a=b; // Надо выполнить эти операции присваивания
b=a;
return 0;
}

Когда T1==T2 тогда все понятно:

template <class T>
class A{
public:
---------
void operator = (const B<T>&);
private:
T width;
};

template <class T>
void A<T>::operator = (const B<T>& rhs){
this->width=rhs.width;
}

Аналогично перегружаем = в классе B, но что делать,
если T1!=T2, как тогда перегрузить оператор = ?

template <class T>
class A{
public:
---------
template <class N>
void operator = (const B<N>&);
private:
T width;
};

template <class T,class N>
void A<T>::operator = (const B<N>& rhs){
this->width=rhs.width;
}


Над такой записью компилятор ругается, есть ли у вас какие-либо варианты;)
PM MAIL   Вверх
blackofe
Дата 7.12.2005, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



AlexKar

вот такое компилится и работает:

Код

template <class T>
class B;

template <class T>
class A {
public:
    A(const T &Width) : width(Width) {}
    const A &operator =(const B<T> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    template <class N>
    const A &operator =(const B<N> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    const T &Width() const                        {    return width; }

private:
    T width;
};

template <class T>
class B {
public:
    B(const T &Width) : width(Width) {}
    const B &operator =(const A<T> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    template <class N>
    const B &operator =(const A<N> &rhs)        {    width = rhs.Width();
                                                    return *this; }
    const T &Width() const                        {    return width; }

private:
    T width;
};

int main()
{
    A<int> a(10);
    B<long> b(20);

    cout << "a.width = " << a.Width() << endl;
    cout << "b.width = " << b.Width() << endl;

    a = b;

    cout << "a.width = " << a.Width() << endl;
    cout << "b.width = " << b.Width() << endl;

    b = a;

    cout << "a.width = " << a.Width() << endl;
    cout << "b.width = " << b.Width() << endl;

    return 0;
}


выдает на выходе:

a.width = 10
b.width = 20
a.width = 20
b.width = 20
a.width = 20
b.width = 20
Press any key to continue

то, что тебе нужно?

кстати, тебе только нужно позаботиться о возможности преобразования T в N и обратно. я выбрал int и long - понятно, что компилятор сделает необходимые приведения.

Это сообщение отредактировал(а) blackofe - 7.12.2005, 19:58
PM MAIL   Вверх
Earnest
Дата 8.12.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(blackofe @ 7.12.2005, 19:51)
кстати, тебе только нужно позаботиться о возможности преобразования T в N и обратно.

... позаботится об этом тоже можно как-нибудь погибчее. Например, так:
Код

template <class _Res, class _Arg>
struct type_cast
{
   _Res operator ()(const Arg& a) const { return a; }
};

Соответственно, в коде оператора присваивания от blackofe вместо
Код

width = rhs.Width();
пишем
Код

width = type_cast<T,N>()(rhs.Width());

Для тривиальных случаев сойдет стандартная реализация type_cast, для более сложных - пишем необходимые специализации...



--------------------
...
PM   Вверх
blackofe
Дата 8.12.2005, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Earnest
примерно это я и имел в виду.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.