Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Шаблонный класс


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

#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;
}

Автор: toxx 15.5.2010, 12:48
Код

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

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

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

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

Автор: toxx 15.5.2010, 13:09
Цитата

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

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

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

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

Автор: djamshud 15.5.2010, 13:44
>T& DynArr::operator [](int index) const

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

Код

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

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

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

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

(возврат ссылки позволяет избежать копирования, если T - не копируемый)

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

Код

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

Автор: djamshud 15.5.2010, 14:13
GoldFinch, конечно скомпилится (если учесть, что я привел псевдокод).

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

Код

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


Автор: toxx 15.5.2010, 14:18
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)

Автор: djamshud 15.5.2010, 14:47
toxx, традиция. Вроде hello world.

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

Автор: Metalex 16.5.2010, 15:52
кто-то поможет весь код переделать?
ведь там не долго, главное - знания

Автор: toxx 16.5.2010, 16:14
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)
{
     ....
}

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

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

Автор: toxx 17.5.2010, 20:28
определён так
Код

typedef unsigned int size_t

применяется для счетчиков циклов, индексации массивов,адресной арифметики.
http://www.realcoding.net/articles/chto-takoe-sizet-i-ptrdifft.html подробней расписано что это такое =)

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

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

Автор: toxx 17.5.2010, 20:35
mes
хм, тогда в vs2008=)
http://www.valar.ru/gallery/0510/size_t.jpg

Автор: djamshud 17.5.2010, 20:39
Есть мнение, что на x86_64 будет иначе:).

Автор: mes 17.5.2010, 21:18
Цитата(toxx @  17.5.2010,  19:35 Найти цитируемый пост)
тогда в vs2008=)

это в большей степени зависит не от компилятора, а от платформы.. smile

Автор: GoldFinch 17.5.2010, 21:35
toxx, там что-то вроде
Код

#if defined(_32_BIT_CODE)
    typedef unsigned int size_t;
#else
    typedef unsigned __int64 size_t;
#endif

Автор: toxx 17.5.2010, 21:49
GoldFinch
ага, как раз хотел задать такой вопрос(как же там определено это) , я думал что это это зависит от разрядности системы 32x 64x(как и написал тов.mes ).
спасибо, буду знать =)

Код

__int64// занимает 8 байт в 64х разрядной как я понял...

Автор: mes 17.5.2010, 23:45
Цитата(toxx @  17.5.2010,  20:49 Найти цитируемый пост)
занимает 8 байт в 64х разрядной как я понял..

а в 32х разрядной тогда сколько ?
smile

Добавлено через 2 минуты и 21 секунду
Цитата(toxx @  17.5.2010,  20:49 Найти цитируемый пост)
как же там определено это, я думал что это это зависит от разрядности системы 32x 64x

ага зависит от системы, только не напрямую, а через директивы 
smile

Автор: toxx 17.5.2010, 23:49
mes
4 байта? smile  наверно другого ответа быть и не может?smile
Цитата

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

я как бы это и имел ввиду... язык костлявый )

Автор: mes 18.5.2010, 08:45
Цитата(toxx @  17.5.2010,  22:49 Найти цитируемый пост)
4 байта?   наверно другого ответа быть и не может?

http://msdn.microsoft.com/en-us/library/aa261215(VS.60).aspx

Автор: djamshud 18.5.2010, 10:23
__int64 - какая-то вижуал студиевская придумка. Есть более правильный int64_t из stdint.h.

Автор: toxx 18.5.2010, 12:01
mes
я думал вы не про __int64 а unsigned int =) так конечно __int64=8 байт в 32х разрядной системе.

djamshud
по мне так главное работало =) как уж реализовано для меня не важно, хотя наверно если более глубоко заниматься .. но мне пока до такого уровня далеко.. хотя не за горами этот уровень надеюсь=)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)