Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[С++] Перегрузка операций

18K
11 июня 2007 года
Maniac.by
19 / / 20.03.2007
Перегрузку написал вроде правильно...а с конструктором копирования не уверен...в книгах про него плохо написано...понел что нужен в основ ном для динамических векторов, что б данные правильно копировались..а как реализовать?..мот хоть ссылку дадите где толково написано?:(
p.s. что то невезет последнее время программить...иль книжки не те...
Помогите чем нить, может инфу какую посоветуете...
трудно на заочке программисту учиться...

Вот задачка:
Создать несколько объектов (например, a и b) разработанного класса.
Класс - вектор (одномерный массив).
Реализовать для объектов данного класса перегрузку операции - (c = a - b).
Содержимое объектов (a,b,c, их векторов), до и после выполнения операции,
вывести на экран.

Вот исходник:
Код:
#include <iostream>
#include <conio.h>

#define SIZE 4

using namespace std;
//---------------------------------------------------------------------------
class Array
{
private:
    int *pArray;

public:
    Array();
    ~Array();
    Array(const Array &A);
    void InArray();
    void OutArray();
    Array operator-(Array Temp);
};
//---------------------------------------------------------------------------
Array::Array()
{
    pArray = new int[SIZE];
    if (!pArray) exit(1);
}
//---------------------------------------------------------------------------
Array::~Array()
{
    delete []pArray;
}
//---------------------------------------------------------------------------
//Конструктор копирования - неуверен что написал правильно
Array::Array(const Array &A)
{
    pArray = new int[SIZE];
    if (!pArray) exit(1);
    for (int i = 0; i < SIZE; i++)
        pArray = A.pArray;
}
//---------------------------------------------------------------------------
void Array::InArray()
{
    cout << "Enter Array:" << endl;
    cout << "------------" << endl;
    for (int i = 0; i < SIZE; i++)
    {
        cout << i << "-element: ";
        cin >> pArray;
    }
    cout << endl;
}
//---------------------------------------------------------------------------
void Array::OutArray()
{
    cout << "Array: ";
    for (int i = 0; i < SIZE; i++)
    {
        cout << pArray;
    }
    cout << endl;
}
//---------------------------------------------------------------------------
Array Array::operator-(Array T)
{
    Array Temp;
    for (int i = 0; i < SIZE; i++)
        Temp.pArray = pArray - T.pArray;
    return Temp;
}
//---------------------------------------------------------------------------
int main()
{
    Array oArray_1, oArray_2, oArray_3;


    oArray_1.InArray();
    oArray_2.InArray();

    oArray_1.OutArray();
    oArray_2.OutArray();

    oArray_3 = oArray_1 - oArray_2;
   
    oArray_1.OutArray();
    oArray_2.OutArray();
    oArray_3.OutArray();

    cout << endl << "Press any key ";
    while(!_kbhit());
    return 0;
}
320
11 июня 2007 года
m_Valery
1.0K / / 08.01.2007
Посмотри книги тут и тут.От себя могу посоветовать Б.Страуструпа и С.Липпмана.
Вот твой класс вектор с перегрузкой операторов.Для Visual Studio 2005.
Если нет этой студии - открывай в блокноте и смотри код.Я сделал в одном файле,создаются 2 вектора,вводятся их элементы,потом создается 3-й вектор с = a - b; и все выводится на экран.
18K
12 июня 2007 года
Maniac.by
19 / / 20.03.2007
Спасибо тебе большое добрый человек!:)
Книжки в принцепе у меня неплохие(Г.Шилд,С.Прата,В.В.Подбельский)
...просто когда читаешь книгу..вроде все понятно..а когда уже решаешь программу, то другое...
как говорится изучить язык можно только программируя:rolleyes:
Будем разбираться!:)
361
12 июня 2007 года
Odissey_
661 / / 19.09.2006
в праметрах константная ссылка на объект класса. все нормально. только вот конструкции типа
Цитата:
if (!pArray) exit(1);

я бы внутри класса Array не советовал бы размещать (тем более в конструкторе) . у тебя же класс тип данных представляет, а не кодом управляет. лучше кидать исключение -

 
Код:
class MemoryLack{};
...
if(!pArray) throw MemoryLack();

это будет формально правильней.
260
12 июня 2007 года
Ramon
1.1K / / 16.08.2003
Конструктор копирования похож на правду.

PS: А вы уверены что нужно писать не шаблонный класс-контейнер, а то это только массив элементов типа "int"?
PS2: Ссылки всегда константны по определению и след. "A&" эквивалентно "A& const", а имелась ввиду повидимому ссылка на константный объект а это уже "const A&".
PS3: При таком вызове "pArray = new int[SIZE];" если память не будет выделена то сгенерируется исключение std::bad_alloc, так что проверка и тем более свой аццкий класс для описания исключения здесь вовсе не нужны. Если все же есть желание этого избежать и вставить таки свою любимую проверочку то "pArray = new(std::nothrow) int[SIZE];".
361
12 июня 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
имелась ввиду повидимому ссылка на константный объект


да, именно, лиху дал....

Цитата:
если память не будет выделена то сгенерируется исключение std::bad_alloc


скорее всего да, но не всегда к сожелению...

Цитата:
PRB: Operator New Doesn't Throw bad_alloc Exception on Failure
Q167733

STATUS
This is a bug in Microsoft's implementation of operator new as this in not in conformance with the ANSI C++ Standard.


Цитата:
аццкий класс


=) ну... не такой он и ацкий, просто привычка... но тоже согласен
лучше

 
Код:
throw std::bad_alloc();
309
13 июня 2007 года
el scorpio
1.1K / / 19.09.2006
Перегрузка оператора - объявлена неправильно. Нужно писать так
 
Код:
Array Array::operator-(const Array &T) const

Во-первых, не изменяемые в ходе работы параметры (особенно объекты-контейнеры) лучше передавать по константной ссылке.
Во-вторых, функции, не изменяющие поля класса, должны быть константными. Иначе следующий код вызовет "предупреждение"
 
Код:
const Array A;
Array B;
Array C = A - B; // warning, вызов неконстантного метода
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог