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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонный класс 
V
    Опции темы
Metalex
Дата 15.5.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



Доброго времени суток!
Помогите переделать класс под шаблонный, пожалуйста.
Код

#include <iostream>
using namespace std;

class DynArr
{
    int n;
    int *matrix;
public:
    DynArr ();
    DynArr (int number);
    DynArr (const DynArr &clas);
    ~DynArr ()
    {
        delete [] matrix;
    }
    void Show ();
    DynArr operator= (DynArr & op);
    DynArr operator+ (const DynArr & op2);
    friend int operator* (DynArr op1, DynArr op2);
    int operator[] (int index) const;
};

int i;

DynArr DynArr::operator = (DynArr & op)
{
    if (n!=op.n)
    {
        cout<<"Arrays are not equal"<<endl;
        DynArr temp;
        return temp;
    }
    for (i=0; i<n; i++)
        matrix[i]=op.matrix[i];
    return *this;
}


DynArr DynArr::operator + (const DynArr & op2)
{
    DynArr sum=*this;
    for (i=0; i<n; i++)
        sum.matrix[i]+=op2.matrix[i];
    return sum;
}

int operator * (DynArr op1, DynArr op2)
{
    if (op1.n!=op2.n)
    {
        cout<<"Arrays are not equal"<<endl;
        return 0;
    }
    int index = 0;
    for (i=0; i<op1.n; i++)
        index += op1.matrix[i] * op2.matrix[i];
    return index;
}

int DynArr::operator [](int index) const
{
    if (index>=0 && index<n)
        return matrix[index];
    else
    {
        cout<<"Incorrect index of array";
        return 0;
    }
}


DynArr::DynArr()
{
    n=0;
    matrix=NULL;
}

DynArr::DynArr(int number)
{
    n=number;
    matrix=new type [n];
    cout<<"Put "<<n<<" elements"<<endl;
    for (i=0; i<n; i++)
        cin>>matrix[i];
}

DynArr::DynArr (const DynArr &clas)
{
    n=clas.n;
    matrix=new int [n];
    for (i=0; i<n; i++)
        matrix[i]=clas.matrix[i];
}

void DynArr::Show()
{
    for (i=0; i<n; i++)
        cout<<matrix[i]<<" ";
    cout<<endl;
}

int main ()
{
    DynArr a(3), b(3), c(3);
    cout<<"a, b, c :"<<endl;
    a.Show();
    b.Show();
    c.Show();
    cout<<"a = b"<<endl;
    a=b;
    a.Show();
    b.Show();
    cout<<"c = a + b"<<endl;
    c=(a+b);
    c.Show();
    cout<<"a * b = "<<a*b<<endl;
    cout<<"Put index of array c"<<endl;
    int index;
    cin>>index;
    cout<<index<<" element = "<<c[index]<<endl;
    system ("Pause");
    return 0;
}



--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
toxx
Дата 15.5.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

template <class T>
class DynArr
{
    int n;
    T *matrix;
    ......
};

вместо int ставишь T(любой тип твоего вектора)

Это сообщение отредактировал(а) toxx - 15.5.2010, 12:48
PM MAIL   Вверх
Metalex
Дата 15.5.2010, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



Это ясно smile
А как, например, вот такое переделать:
Код

int DynArr::operator [](int index) const



--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
toxx
Дата 15.5.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А как, например, вот такое переделать

Вы так и не послушали тогда переделать на size_t чтоб >0 не писать =)

так наверно:
Код

T& DynArr::operator [](int index) const


Это сообщение отредактировал(а) toxx - 15.5.2010, 13:10
PM MAIL   Вверх
djamshud
Дата 15.5.2010, 13:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



>T& DynArr::operator [](int index) const

Тут архитектураная ошибка.

Код

void foo(DynArr const &arr){
arr[0]=...;//фактическое изменение казалось бы константного объекта
};



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
GoldFinch
Дата 15.5.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



Цитата(djamshud @  15.5.2010,  14:44 Найти цитируемый пост)
>T& DynArr::operator [](int index) const

Тут архитектураная ошибка.

скорей всего это даже не скомпилится. надо 
const T& operator [](int index) const

(возврат ссылки позволяет избежать копирования, если T - не копируемый)
PM MAIL ICQ   Вверх
toxx
Дата 15.5.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



djamshud
не обратил внимания на это, сам когда писал без const использовал(всё работает =) )
GoldFinch
а не лучше без const вообще?

Код

T& DynArr::operator [](int index)


Это сообщение отредактировал(а) toxx - 15.5.2010, 14:04
PM MAIL   Вверх
djamshud
Дата 15.5.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



GoldFinch, конечно скомпилится (если учесть, что я привел псевдокод).

toxx, Metalex, обычно делают так:

Код

T const& operator[](int)const;
T& operator[](int);




--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
toxx
Дата 15.5.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



djamshud
да, когда я писал делал свой вектор делал так
Код

T& operator[](int);

тут, из-за моего незнания что такое и в чем разница между
Код

T& DynArr::operator [](int index) const
const T& DynArr::operator [](int index) const
...


написал не глядя, вот вы и поправили хорошо...надо прочитать про это..спасибо

а почему пишите обычно если пример класса или функции то название foo?
Код

class foo{};

Код

void foo(DynArr const &arr)


Это сообщение отредактировал(а) toxx - 15.5.2010, 14:27
PM MAIL   Вверх
djamshud
Дата 15.5.2010, 14:47 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



toxx, традиция. Вроде hello world.

Добавлено через 1 минуту и 4 секунды
http://ru.wikipedia.org/wiki/Метапеременная


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Metalex
Дата 16.5.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



кто-то поможет весь код переделать?
ведь там не долго, главное - знания



--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
toxx
Дата 16.5.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Metalex
Проверь, мог намудрить.и твой оператор* фиг знает чего делает(он по идее должен быть методом класса, а не другом), сам переделай =)
Код

#include <iostream>
using namespace std;
template <class T>
class DynArr
{
    size_t n;
    T *matrix;
public:
    DynArr ();
    DynArr (size_t number);
    DynArr (const DynArr &clas);
    ~DynArr ()
    {
        delete [] matrix;
    }
    void Show ();
    DynArr operator= (const DynArr & op);
    DynArr operator+ (const DynArr & op2);
    T& operator[] (size_t index);
};
template <class T>
DynArr<T> DynArr<T>::operator = (const DynArr & op)
{
    if (n!=op.n)
    {
        cout<<"Arrays are not equal"<<endl;
        DynArr temp;
        return temp;
    }
    for (size_t i=0; i<n; i++)
        matrix[i]=op.matrix[i];
    return *this;
}
template <class T>
DynArr<T> DynArr<T>::operator + (const DynArr & op2)
{
    DynArr sum=*this;
    for (size_t i=0; i<n; i++)
        sum.matrix[i]+=op2.matrix[i];
    return sum;
}

template <class T>
T& DynArr<T>::operator [](size_t index) 
{
    if (index<n)
        return matrix[index];
}
template <class T>
DynArr<T>::DynArr()
{
    n=0;
    matrix=NULL;
}
template <class T>
DynArr<T>::DynArr(size_t number)
{
    n=number;
    matrix=new T [n];
    cout<<"Put "<<n<<" elements"<<endl;
    for (size_t i=0; i<n; i++)
        cin>>matrix[i];
}
template <class T>
DynArr<T>::DynArr (const DynArr &clas)
{
    n=clas.n;
    matrix=new T [n];
    for (size_t i=0; i<n; i++)
        matrix[i]=clas.matrix[i];
}
template <class T>
void DynArr<T>::Show()
{
    for (size_t i=0; i<n; i++)
        cout<<matrix[i]<<" ";
    cout<<endl;
}


Также оператор= должен не проверять на совпадение размерности, а проверять на присваивание самому себе т.е.
Код

if(this!=&DynArr)
{
     ....
}

если это выполняется он должен освобождать старую память, выделить новую и перекопировать элементы.

Это сообщение отредактировал(а) toxx - 16.5.2010, 16:21
PM MAIL   Вверх
Metalex
Дата 17.5.2010, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



toxx, отлично! немного подправил твой код и все работает!
Я хоть и почитал, но обьясни еще, пожалуйста, на пальцах, что такое size_t.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
toxx
Дата 17.5.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



определён так
Код

typedef unsigned int size_t

применяется для счетчиков циклов, индексации массивов,адресной арифметики.
тут подробней расписано что это такое =)
PM MAIL   Вверх
mes
Дата 17.5.2010, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(toxx @  17.5.2010,  19:28 Найти цитируемый пост)
определён так

не всегда так smile 



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

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

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

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

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


 




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


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

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