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


Автор: Storm_tpv 17.12.2007, 22:06
Здраствуйте.
Не могу понять как сделать так чтобы можно было вводить массив любоей длины :(

Основное написал, а дальше не могу понять каков синтаксис описания создания массива любой длины.

Вот задание:
Создать шаблонную функцию, меняющую порядок элементов на обратный. 
    На пример:  1 2 3 4 5 6  -  6 5 4 3 2 1. Функция должна работать с массивом любой длины.

вот мой код:
Код

#include <iostream.h>

const int defaultSize = 10;

template <class T>
class array
{
public:
    array(int itsSize = defaultSize);
    array(const array &rhs);
    ~array() { delete [] pType; }

    array &operator=(const array&);
    T &operator[](int offset) { return pType[offset]; }
    const T &operator[](int offset) const
    {    return pType[offset];    }
    int getSize() { return itsSize; }
private:
    T *pType;
    int itsSize;
};

template <class T>
array<T>::array(int size):
itsSize(size)
{
    pType = new T[size];
    for (int i=0; i<size; i++)
        pType[i]=0;
}

template <class T>
array<T>::array(const array &rhs)
{
    itsSize = rhs.getSize();
    pType = new T[itsSize];
    for (int i=0; i<itsSize; i++)
        pType[i] = rhs[i];
}

template <class T>
array<T> &array<T>::operator =(const array &rhs)
{
    if (this==rhs)
        return *this;
    delete[] pType;
    itsSize = rhs.getSize();
    pType = new T[itsSize];
    for (int i=0; i<itsSize; i++)
        pType[i] = rhs[i];
    return *this;
}

int main()
{
    array<int> intArray;
    array<double> dblArray;

    for (int i=0; i<intArray.getSize(); i++)
    {
        intArray[i]=i*2;
        dblArray[i] = i*3;
    }
    for (int j=0; j<intArray.getSize(); j++)
    {
        cout << "intArray[" << j << "]:\t";
        cout << intArray[j] << "\t\t";
        cout << "dblArray[" << j << "]:\t";
        cout << dblArray[j] << "\t\t";
        cout << endl;
    }

    for (int j=0; j<intArray.getSize(); j++)
    {
        cout << "intArray[" << j << "]:\t";
        cout << intArray[j] << "\t\t";
        cout << "dblArray[" << j << "]:\t";
        cout << dblArray[j] << "\t\t";
        cout << endl;
    }
    return 0;
}





Добавлено через 3 минуты и 47 секунд
если я напишу так:

Код

array<int> intArray(14);


то при выводе элементов программа заглючивает.

Автор: onsql 17.12.2007, 22:22
А заглючивает небось на выводе double ? Если ты меняешь только размер массива intArray то при печати ты обращаешься к несуществующим элементам массива dblArray. Ставь у них одинаковый размер или печатай их отдельными циклами.

Автор: Storm_tpv 17.12.2007, 22:23
Код

#include <iostream.h>

//const int size=10;

template <class T>

class array
{
public:
    array(int itsSize = size);
//    array(const array &rhs);
    ~array() { if(pType) delete[] pType; }

    T& operator[](int offset) const { return pType[offset]; }
    int getSize() { return itsSize; }
    
private:
    T *pType;
    int itsSize;
};

template <class T>
array<T>::array(int size):itsSize(size)
{
    pType = new T[size];
    for (int i=0; i<size; i++)
        pType[i]=0;
}
/*
template <class T>
array<T>::array(const array &rhs)
{
    itsSize = rhs.getSize();
    pType = new T[itsSize];
    for (int i=0; i<itsSize; i++)
        pType[i]=rhs[i];
}
*/
int main()
{
    array<int> intArray(14);

    for (int i=0; i<intArray.getSize(); i++)
    {
        cin >> intArray[i];
    }

    for (int j=0; j<intArray.getSize(); i++)
    {
        cout << intArray[j] << endl;
    }
    return 0;
}

я даже так сделал! Все раво при выводе зацикливается



Добавлено через 1 минуту и 41 секунду
все работает

я нашел синтаксическую ошибку

Код

for (int j=0; j<intArray.getSize(); i++)


smile

Автор: onsql 17.12.2007, 22:29
i++ вместо j++ во втором цикле? smile

И в самом первом исходнике
Код

template <class T>
array<T> &array<T>::operator =(const array<T> &rhs)
{
   //    if (this==rhs)  <- должна вылететь ошибка когда будешь присваивать массивы
     if(this == &rhs)
        return *this;
    delete[] pType;
    itsSize = rhs.getSize();
    pType = new T[itsSize];
    for (int i=0; i<itsSize; i++)
        pType[i] = rhs[i];

  return *this;
}

 

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