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

Поиск:

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


Опытный
**


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

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



Нужно было создать класс "Динамический массив" и перегрузить операции "=" для поэлементного присваивания, "+" для поэлементного слаживания, "*" для скалярного умножения и оператор индексирования для доступа к элементу динамического массива.
Накатал такой код.. а с перегрузкой "+" и "[]" возникают какие-то проблемы.. помогите разобратся, пожалуйста.
Код

#include <iostream>
using namespace std;

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

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 operator + (DynArr op1, DynArr op2)
{
    if (op1.n!=op2.n)
    {
        cout<<"Arrays are not equal"<<endl;
        DynArr tempo;
        return tempo;
    }
    DynArr temp;
    temp.n=op1.n;
    temp.matrix=new int [temp.n];
    for (i=0; i<temp.n; i++)
        temp.matrix[i]=op1.matrix[i]+op2.matrix[i];
    return temp;
}

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)
{
    if (index<0 || index>n)
    {
        cout<<"Incorrect index of array";
        return 0;
    }
    return matrix[index];
}


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

DynArr::DynArr(int number)
{
    n=number;
    matrix=new int [n];
    cout<<"Put "<<n<<" elements"<<endl;
    for (i=0; i<n; i++)
        cin>>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   Вверх
xvr
Дата 7.5.2010, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Metalex @  7.5.2010,  10:47 Найти цитируемый пост)
а с перегрузкой "+" и "[]" возникают какие-то проблемы..
Проблемы не с ними, а с отсуствием copy конструктора. Автоматически генерируемый copy конструктор работает неправильно - он не копирует массив, а только указатель на него. После чего возникают проблемы когда оригинальный класс удаляется (вместе с массивом) и массив в копии начинает указывать непонятно куда.
Это уже обсасывали мульён раз со всех сторон  smile 


PM MAIL   Вверх
toxx
Дата 7.5.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1.заведите конструктор копирования
2.
Код

int DynArr::operator [](size_t index) const // лучше объявить как size_t index, не нужна будет проверка на 0 и const добавить.
{
    if(indexx<n) return matrix[index];
    else 
    {
        cout<<"Incorrect index of array";
        return 0;
    }
}

3.
Код

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

PM MAIL   Вверх
Metalex
Дата 7.5.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, разобрался, обьясните, пожалуйста, еще почему здесь:
Код

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

const?
Код

DynArr operator + (const DynArr & op2)

и здесь? зачем это?


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


uploading...
****


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

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



Цитата(Metalex @  7.5.2010,  11:56 Найти цитируемый пост)
Спасибо, разобрался, обьясните, пожалуйста, еще почему здесь:
Выделить всёкод C++
1:
    
int DynArr::operator [](size_t index) const

const?

в двух словах - потому что эта функция ничего не меняет и такая функция может быть вызвана для константного объекта.

Цитата(Metalex @  7.5.2010,  11:56 Найти цитируемый пост)
и здесь? зачем это? 

зачем что?
PM   Вверх
rudvil
Дата 7.5.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



Цитата(azesmcar @  7.5.2010,  11:31 Найти цитируемый пост)
зачем что? 


Помоему про передачу аргумента через ссылку, т.е. 
Цитата
DynArr operator + (const DynArr & op2)

--------------------
xor
PM MAIL Skype   Вверх
toxx
Дата 7.5.2010, 14:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rudvil 
не просто ссылку, а константную =)
PM MAIL   Вверх
xvr
Дата 7.5.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Metalex @  7.5.2010,  11:56 Найти цитируемый пост)
и здесь? зачем это? 
Что бы параметром мог выступать временный объект. Например так:
Код

DynArr a,b,c,d,e;
e=(a+b)+(c+d);


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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