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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка ==, error : conditional expression of type 
:(
    Опции темы
niknor
Дата 22.10.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

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



Не подскажете  Почему возникает ошибка
 smile error C2451: conditional expression of type 'Matr' is illegal
и как её исправить

Код

class Matr
{
private:
    int stl, str;
    double *tab;
    double  DetVn(double* a,int n);
public:
//...
//...
friend Matr operator ==(const Matr& a, const Matr& b);
//...
//...
};
Matr operator ==(const Matr& a, const Matr& b)
{
    bool ist(true);
    if((b.stl==a.stl)&&(b.str==a.str))
    {
        for(int i(0); i<a.str; i++)
            for(int j(0); j<a.stl; j++)
                if(a.tab[i*a.stl+j]!=b.tab[i*a.stl+j])
                    ist=false;
        return ist;
    }
    else
    {
        ist=false;
        return ist;
    }
}
void main()
{
    int n,m;
    rus("Введите количество строк\n");
    cin>>n;
    rus("Введите количество столбцов\n");
    cin>>m;
    double* mt=new double[n*m];
    rus("Введите матрицу\n");
    for(int i(0); i<n;i++)
        for(int j(0);j<m;j++)
            cin>>mt[i*m+j];
    Matr mat(n,m,mt);
    double* md=new double[n*m];
    rus("Введите матрицу\n");
    for(int i(0); i<n-1;i++)
        for(int j(0);j<m-1;j++)
            cin>>md[i*m+j];
    Matr mat2(n-1,m-1,md);
    if(mat==mat2)
    {
        cout<<"Ravni";
    }
    else
    {
        cout<<"!=";
    }
}
Заранее спасибо
PM MAIL   Вверх
Void
Дата 22.10.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Потому что оператор == должен возвращать bool или нечто, приводимое к bool.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
EvgenZ
Дата 22.10.2006, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



у меня нормально компилирует  smile  ввожу матрицу...


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
niknor
Дата 22.10.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

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




EvgenZ, А почему у меня нет??

PM MAIL   Вверх
Xenon
Дата 22.10.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Во-первых bool должен возвращать operator==, во-вторых зачем он объвлен как friend? Зачем это?


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 22.10.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(niknor @  22.10.2006,  21:08 Найти цитируемый пост)
А почему у меня нет??

сути не меняет. надо возвращать bool
PM MAIL WWW   Вверх
niknor
Дата 22.10.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

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



Вот весь текст:
Код

#include <iostream>
#include <iomanip>
#include <conio.h>
#include <windows.h>

using namespace std;

void rus(char*a)
{
    char*b=new char[strlen(a)+1];
    CharToOem(a,b);
    cout<<b;
    delete[] b;
}



class Vektor;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

class Matr
{
private:
    int stl, str;
    double *tab;
    double  DetVn(double* a,int n);
public:
    Matr();
    Matr( const int a, const int b, const double *VhMt);
    Matr(const int a, const int b);
    Matr(const int a);
    Matr(const Matr&);    //copy constructor
    ~Matr();
    double Poluch(const int, const int) const;
    int NomStr() const            
    { 
        return str; 
    }
    int NomStl() const            
    { 
        return stl;
    }

    friend Matr operator +(const Matr& a);
    friend Matr operator +(const Matr& a, const Matr& b);
    friend Matr operator -(const Matr& a);
    friend Matr operator -(const Matr& a, const Matr& b);
    friend Matr operator ==(const Matr& a, const Matr& b);
    

    Matr& operator =(const Matr& a);
    Matr& operator =(double l);
    Matr& operator ++();
    Matr& operator --();
    
    void Izm(int, int, double);
    void Ekr() const;    
    void Det();
    friend Vektor MatVek( Matr G );
    friend Matr VekMat( Vektor H, int n, int m);
};

Matr::Matr()
{
    stl=1;
    str=1;
    tab=new double[1];
    tab[0]=0;
}
Matr::Matr(const Matr &fs)
{
    str=fs.str;
    stl=fs.stl;
    tab=new double[stl*str];
    for (int i(0); i<str; i++)
        for (int j(0); j<stl ; j++)
            tab[i*stl+j]=fs.tab[i*stl+j];
}

Matr::Matr(const int a,const int b,const double*  VhMt)
{
    str=a;
    stl=b;
    if ((str==0) || (stl==0))
    {
        rus("Количество столбцов или строк задано неверно");
        exit(-88);
    }
    if (!(tab=new double[str*stl]))
    {
        rus("Памяти Маловато");
        cout<<endl;
        exit(-99);
    }
    else    
    {
        for (int i(0); i<str; i++)
        {
            for (int j(0); j<stl ; j++)
                tab[i*stl+j]=VhMt[i*stl+j];
        }
    }
}

Matr::Matr(const int a, const int b)
{
    str=a;
    stl=b;
    if ((str==0) || (stl==0))
    {
        rus("Количество столбцов или строк задано неверно");
        exit(-88);
    }
    if (!(tab=new double[str*stl]))
    {
        rus("Памяти Маловато");
        cout<<endl;
        exit(-99);
    }
    else    
    {
        for (int i(0); i<str; i++)
        {
            for (int j(0); j<stl ; j++)
                tab[i*stl+j]=0;
        }
    }
}

Matr::Matr(const int a)
{
    str=a;
    stl=a;
    if (str==0)
    {
        rus("Количество столбцов или строк задано неверно");
        exit(-88);
    }
    if (!(tab=new double[str*stl]))
    {
        rus("Памяти Маловато");
        cout<<endl;
        exit(-99);
    }
    else    
    {
        for (int i(0); i<str; i++)
        {
            for (int j(0); j<stl ; j++)
                tab[i*stl+j]=0;
        }
    }
}

Matr::~Matr()
{
    delete[] tab;
}
double Matr::Poluch(const int i, const int j) const
{
    if((i>str)||(j>stl))
    {
        rus("Ошибка");
        exit(-876);
    }
    else
    {
        return tab[i+j*str];
    }
}



void Matr::Izm(int i, int j, double Elm)
{
    if( (i>str)||(j>stl) )
    {
        rus("Индексы изменяемого элемента указаны неверно!!");
        exit(-3886);
    }
    else
    {
        tab[i*stl+j] = Elm;
    }
}

void Matr::Ekr()const
{
    rus("Матрица: \n");
    for(int i(0); i<str; i++)
    {
        for(int j(0); j<stl; j++)
            cout<<tab[i*stl+j]<<" "; 
        cout<<endl;
    }
}

void Matr::Det()
{

    if(stl!=str)
        rus("Ошибка!! Матрица не квадратная");
    else
    {
        double vf=DetVn( tab, stl);
        cout<<vf;
    }
}

double Matr::DetVn(double* a,int n)
{
    double result(0);      
    int       index, deg;

    if(n < 1)
        return 0;
    else if(n == 1)
        return a[0];
    else if(n == 2)
        return(a[0] * a[1*n+1] - a[1*n+0] * a[0*n+1]);
    double*  minor;
    minor = new double [(n - 1)*(n - 1)];  
    for (int i(0); i < n; i++)
    {
        index=0;
        for ( int j(0); j < n; j++)
        {       
            if(j != i)                            
            {
                for (int k(1); k < n; k++)                     
                    minor[index*(n-1)+(k - 1)] = a[j*n+k];                     
                index++;
            }
        }      
        if((i + 1) % 2) 
            deg=-1;
        else
            deg=1;
        result= result + a[i*n+0] * deg * DetVn(minor, n - 1);
    }    
    delete [] minor;
    return -1*(result);         
}


Matr operator +(const Matr& a)
{
    return (a);
}
Matr operator +(const Matr& a, const Matr& b)
{
    if((b.stl==a.stl)&&(b.str==a.str))
    {
        Matr c(a.str,a.stl);
        for(int i(0); i<a.str; i++)
            for(int j(0); j<a.stl; j++)
                c.tab[i*a.stl+j]=a.tab[i*a.stl+j]+b.tab[i*a.stl+j];
        return c;
    }
    else
    {
        rus("Размерности не совпадают");
        exit(1320);
    }
}

Matr operator -(const Matr& a)
{
    Matr b(a);
    /*Matr b(a.stl,a.str);
    for(int i(0);i<(a.stl*a.str);i++)
    {
    b.tab[i]=a.tab[i]-1;
    }*/
    for(int i(0); i<a.str; i++)
        for(int j(0); j<a.stl; j++)
            b.tab[i*a.stl+j]=(-1)*b.tab[i*a.stl+j];
    return b;
}

Matr operator -(const Matr& a, const Matr& b)
{
    if((b.stl==a.stl)&&(b.str==a.str))
    {
        Matr c(a.str,a.stl);
        for(int i(0); i<a.str; i++)
            for(int j(0); j<a.stl; j++)
                c.tab[i*a.stl+j]=a.tab[i*a.stl+j]-b.tab[i*a.stl+j];
        return c;
    }
    else
    {
        rus("Размерности не совпадают");
        exit(1320);
    }
}

Matr operator ==(const Matr& a, const Matr& b)
{
    bool ist(true);
    if((b.stl==a.stl)&&(b.str==a.str))
    {
        for(int i(0); i<a.str; i++)
            for(int j(0); j<a.stl; j++)
                if(a.tab[i*a.stl+j]!=b.tab[i*a.stl+j])
                    ist=false;
        return ist;
    }
    else
    {
        ist=false;
        return ist;
    }
}

Matr &Matr::operator =(const Matr& a)
{
    if(this!=&a)
    {
        stl=a.stl;
        str=a.str;
        delete[] tab;
        tab=new double[stl*str];
        for(int i(0); i<str; i++)
            for(int j(0); j<stl; j++)
                tab[i*stl+j]=a.tab[i*stl+j];

    }
    return *this;
}

Matr &Matr::operator =(double l)
{
    delete[] tab;
    stl=1;
    str=1;
    tab=new double[1];
    tab[0]=l;
    return *this;

}



Matr &Matr::operator ++()
{
    for(int i(0);i<str;i++)
        for(int j(0);j<stl;j++)
            tab[i*stl+j]++;
    return *this;
}

Matr &Matr::operator --()
{
    for(int i(0);i<str;i++)
        for(int j(0);j<stl;j++)
            tab[i*stl+j]--;
    return *this;
}

class Vektor
{
private:
    double *Vec;   //vektor
    int razm;      //razmernost vektora
public:
    Vektor(int, double*);
    Vektor(int);
    Vektor();
    Vektor(const Vektor&);
    ~Vektor();
    double Poluch(int) const;
    void Izm(int, double);
    int Razm()const;
    void Ekr() const;
    friend Vektor MatVek( Matr G );
    friend Matr VekMat( Vektor H, int n, int m);


};

Vektor::Vektor()
{
    razm=1;
    Vec= new double[1];
    Vec[1]=0;
}

Vektor::Vektor(const Vektor &kn)
{
    razm=kn.razm;
    Vec=new double[razm];
    for (int i(0); i<razm; i++)
        Vec[i]=kn.Vec[i];
}

Vektor::Vektor( int p )
{
    razm=p;
    if(razm<=0)
    {
        rus("Количество столбцов или строк задано неверно");
        exit(-88);
    }
    if (!(Vec=new double[razm]))
    {
        rus("Памяти Маловато");
        cout<<endl;
        exit(-99);
    }
    else
        for(int i(0); i<razm; i++)
        {
            Vec[i]=0;
        }
}

Vektor::Vektor(int p, double* BVec)
{
    razm=p;
    if(razm<=0)
    {
        rus("Количество столбцов или строк задано неверно");
        exit(-88);
    }
    if (!(Vec=new double[razm]))
    {
        rus("Памяти Маловато");
        cout<<endl;
        exit(-99);
    }
    else
        for(int i(0); i<razm; i++)
        {
            Vec[i]=BVec[i];
        }
}

Vektor::~Vektor()
{
    delete[] Vec;
}

double Vektor::Poluch(int s) const  //Возврашает элемент
{
    if(s>razm)
    {
        rus("Ошибка");
        exit(-476);
    }
    else
    {
        return Vec[s];
    }
}

void Vektor::Izm(int s, double zn)
{
    if(s>razm)
    {
        rus("Ошибка");
        exit(-476);
    }
    Vec[s]=zn;
}

int Vektor::Razm() const
{
    return razm;
}

void Vektor::Ekr() const
{
    rus("Вектор: \n");
    for(int i(0); i<razm; i++)
    {        
        cout<<Vec[i]<<" "; 
    }
    cout<<endl;
}

Vektor MatVek( Matr G )
{
    Vektor Prom((G.stl)*(G.str));
    for(int i(0) ;i<(G.str*G.stl); i++)
        Prom.Vec[i]=G.tab[i];
    /*    
    int p(0);
    for(int i(0); i<(G.str); i++)
    for(int j(0); j<(G.stl); j++)
    {
    Prom.Vec[p]=G.tab[i*(G.stl)+j];
    p++;
    }*/
    return Prom;
}

Matr VekMat( Vektor H, int n, int m)
{
    if(H.razm!=(n*m))
    {
        rus("Ошибка/не совпадают размерности");
    }
    else
    {
        Matr Prom(n, m);
        for(int i(0); i<(n*m); i++)
            Prom.tab[i]=H.Vec[i];
        return Prom;
    }
}


void main()
{
    int n,m;
    rus("Введите количество строк\n");
    cin>>n;
    rus("Введите количество столбцов\n");
    cin>>m;
    double* mt=new double[n*m];
    rus("Введите матрицу\n");
    for(int i(0); i<n;i++)
        for(int j(0);j<m;j++)
            cin>>mt[i*m+j];
    Matr mat(n,m,mt);
    double* md=new double[n*m];
    rus("Введите матрицу\n");
    for(int i(0); i<n-1;i++)
        for(int j(0);j<m-1;j++)
            cin>>md[i*m+j];
    Matr mat2(n-1,m-1,md);
    if(mat==mat2)
    {
        cout<<"Ravni";
    }
    else
    {
        cout<<"!=";
    }
    /*rus("Введите номер элемента который хотите вытащить:");
    int s,h;
    cout<<"i=";cin>>s;
    cout<<endl<<"j=";cin>>h;
    cout<<endl<<mat.Poluch(s-1,h-1);
    Matr mat2(mat);                     //Копированиe
    mat2.Ekr();
    Vektor M(MatVek(mat));              //Дружественные ф-ции
    M.Ekr();
    Matr K(VekMat(M,n,m));
    K.Ekr();
    mat.Det();                             //Детерминант
    mat++;
    mat--;
    mat.Ekr();
    double v(12.4);
    mat=v;*/
    //Matr mat3(n,m);
    //mat3=mat+mat2;
    //mat3.Ekr();
    getch();
}

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(Xenon @  22.10.2006,  21:09 Найти цитируемый пост)
во-вторых зачем он объвлен как friend? Зачем это? 

Он в наглую использует приват мемберыsmile
PM MAIL WWW   Вверх
niknor
Дата 22.10.2006, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

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



Ну я bool и возвравщаю
PM MAIL   Вверх
Xenon
Дата 22.10.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Daevaorn, нарушение принципов ООП smile


--------------------
user posted image  
PM MAIL   Вверх
niknor
Дата 22.10.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

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



Цитата

во-вторых зачем он объвлен как friend? Зачем это?

Но ведь он(==) ничего не меняет в закрытых переменных класса
PM MAIL   Вверх
Xenon
Дата 22.10.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



niknor, ты нарушуешь инкапсуляцию данных.
Если метод ничего не меняет, его нужно объвлять как const, а не как friend smile Что за железная логика: "Если функция не меняет полей класса, то ее нужно объявить другом класса"?
Где тут bool?
Код

Matr operator ==(const Matr& a, const Matr& b) 

Так делай (в классе тоже поменяй и вообще все перегрузки операторов перепиши)
Код

bool Matr::operator==(const Matr& a, const Matr& b) const


Это сообщение отредактировал(а) Xenon - 22.10.2006, 20:18


--------------------
user posted image  
PM MAIL   Вверх
Void
Дата 22.10.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(niknor @  22.10.2006,  22:11 Найти цитируемый пост)
Ну я bool и возвравщаю 

По сигнатуре оператора не видно.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Xenon
Дата 22.10.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Если в сигнатуре не указан тип, то возвращается int, а не bool smile


--------------------
user posted image  
PM MAIL   Вверх
niknor
Дата 22.10.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

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



Цитата

Что за железная логика: "Если функция не меняет полей класса, то ее нужно объявить другом класса"?


Ну так вот учут в университете

Добавлено @ 20:24 
Всем спасибо smile 
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.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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