#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;
}
[С++] Перегрузка операций
p.s. что то невезет последнее время программить...иль книжки не те...
Помогите чем нить, может инфу какую посоветуете...
трудно на заочке программисту учиться...
Вот задачка:
Создать несколько объектов (например, a и b) разработанного класса.
Класс - вектор (одномерный массив).
Реализовать для объектов данного класса перегрузку операции - (c = a - b).
Содержимое объектов (a,b,c, их векторов), до и после выполнения операции,
вывести на экран.
Вот исходник:
Код:
тут и тут.От себя могу посоветовать Б.Страуструпа и С.Липпмана.
Вот твой класс вектор с перегрузкой операторов.Для Visual Studio 2005.
Если нет этой студии - открывай в блокноте и смотри код.Я сделал в одном файле,создаются 2 вектора,вводятся их элементы,потом создается 3-й вектор с = a - b; и все выводится на экран.
Посмотри книги
Вот твой класс вектор с перегрузкой операторов.Для Visual Studio 2005.
Если нет этой студии - открывай в блокноте и смотри код.Я сделал в одном файле,создаются 2 вектора,вводятся их элементы,потом создается 3-й вектор с = a - b; и все выводится на экран.
Книжки в принцепе у меня неплохие(Г.Шилд,С.Прата,В.В.Подбельский)
...просто когда читаешь книгу..вроде все понятно..а когда уже решаешь программу, то другое...
как говорится изучить язык можно только программируя:rolleyes:
Будем разбираться!:)
Цитата:
if (!pArray) exit(1);
я бы внутри класса Array не советовал бы размещать (тем более в конструкторе) . у тебя же класс тип данных представляет, а не кодом управляет. лучше кидать исключение -
Код:
class MemoryLack{};
...
if(!pArray) throw MemoryLack();
...
if(!pArray) throw MemoryLack();
это будет формально правильней.
PS: А вы уверены что нужно писать не шаблонный класс-контейнер, а то это только массив элементов типа "int"?
PS2: Ссылки всегда константны по определению и след. "A&" эквивалентно "A& const", а имелась ввиду повидимому ссылка на константный объект а это уже "const A&".
PS3: При таком вызове "pArray = new int[SIZE];" если память не будет выделена то сгенерируется исключение std::bad_alloc, так что проверка и тем более свой аццкий класс для описания исключения здесь вовсе не нужны. Если все же есть желание этого избежать и вставить таки свою любимую проверочку то "pArray = new(std::nothrow) int[SIZE];".
Цитата:
имелась ввиду повидимому ссылка на константный объект
да, именно, лиху дал....
Цитата:
если память не будет выделена то сгенерируется исключение 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.
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();
Код:
Array Array::operator-(const Array &T) const
Во-первых, не изменяемые в ходе работы параметры (особенно объекты-контейнеры) лучше передавать по константной ссылке.
Во-вторых, функции, не изменяющие поля класса, должны быть константными. Иначе следующий код вызовет "предупреждение"
Код:
const Array A;
Array B;
Array C = A - B; // warning, вызов неконстантного метода
Array B;
Array C = A - B; // warning, вызов неконстантного метода