7324
« : 17 Март 2011, 01:07:30 »
Mr2, а , ты об этом, я уже убирал ;, там не в ней дело, вот смотри:
//свой класс-массив
//+ возможность получать min или max элемент массива
# include <iostream>
# include <iomanip>
# include <cstring>
using namespace std;
class Array
{
friend ostream &operator<<(ostream &output, Array &test);
friend ostream &operator>>(ostream &output, Array &test);
public:
//конструктор по умолчанию
Array(int a, int b)
{
row=(a>0) ? a:1;
column=(b>0)? b:1;
ptr= new int [row*column+1];
for (int i=1;i<row*column+1;i++)
ptr[i]=0;
}
//конструктор копии который не работает
Array (const Array &abc)
{
if (*this!=abc)
{
if (row!=abc.row || column!=abc.column)
{
delete []ptr;
row=abc.row;
column=abc.column;
ptr=new int[row*column+1];
}
for (int i=0;i<row*column+1;i++)
ptr[i]=abc.ptr[i];
}
else exit(1);
}
//возможность обращения к нужному элементу массива
int &operator()(int a, int b)
{
if ((a>0) && (a<=row) &&(b>0) && (b<=column))
if (a==1)
return ptr[a+b];
else
return ptr[(a-1)*column+b];
else
exit(100500);
}
//возможность обращения к нужному элементу массива для const объекта класса
int &operator()(int a, int b) const
{
if ((a>0) && (a<=row) &&(b>0) && (b<=column))
if (a==1)
return ptr[a+b];
else
return ptr[(a-1)*column+b];
else
exit(100500);
}
//возможность нахождения min/max элемента
int &operator()(string a)
{
if (a=="maximum")
{
int *max=&ptr[1];
for (int i=1;i<row*column+1;i++)
if (ptr[i]>*max)
max=&ptr[i];
return *max;
}
else if (a=="minimum")
{
int *min=&ptr[1];
for (int i=1;i<row*column+1;i++)
if(ptr[i]<*min)
min=&ptr[i];
return *min;
}
exit (1);
}
//проверка на равенство
bool operator==(Array test)
{
if ((row!=test.row) || (column!=test.column))
return false;
for (int j=0;j<row*column+1;j++)
if (ptr[j]!=test.ptr[j])
return false;
return true;
}
//проверка на неравенство
bool operator !=(Array test)
{
return !(*this==test);
}
private:
int row; //колличество строк
int column; //колличество столбцов
int *ptr; //указатель на массив с элементами int
};
ostream &operator<<(ostream &output, Array &test)
{
output<<endl;
for (int i=1;i<((test.row*test.column)+1);i++)
{
output<<setw(3)<<test.ptr[i]<<" ";
if ((i)%test.column==0)
output<<endl;
}
return output;
}
ostream &operator>>(ostream &output, Array &test)
{
output<<endl;
for (int i=1;i<((test.row*test.column)+1);i++)
output<<setw(3)<<test.ptr[i]<<" ";
output<<endl;
return output;
}
int main()
{
Array a(2,3);
a(1,1)=3;
a(2,2)=5;
Array b(5,5);
b(1,4)=10;
b(3,3)=20;
cout<<"a=b ? : "<<boolalpha<<(a==b);
cout<<"\nA:"<<a<<"B:"<<b;
cout<<b("maximum");
return 0;
}
Добавлено позже:
+ мне по прежнему интересно почему будет крешится программа с этой неправильной проверкой в конструкторе если в main он (констркутор копии) использоваться НЕбудет, но будет использоваться сравнение (== или !=). Вот сам попробуй убрать строку в main где используется сравнение и программа скомпилируется и будет работать нормально, но где же связь? Операции сравнения у меня никак не используют конструктор копии же.