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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает переопределение, Виртуальной функции 
:(
    Опции темы
Vetos
Дата 3.12.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте программисты.
Си пп билдер 6.0
Делаю контрольную в универ, и не получается кое что в последней лабе)
Я в си пп новичек может штото непонял.
Вот кусок кода в котором ошибочка, вернее не ошибочка а несработка:(
Код

class Telement { 
protected:
Telement *left, *right;
Telement (Telement* L,Telement* R)
{
left = L; right = R;
} 
public:
~Telement(void) {delete left; delete right;}
virtual double rezult(void)       {}
virtual Telement* copy(void)    {}
virtual Telement* differ(void)   {}    
virtual void set_var(double X)
    {
if (left)    left -> set_var(X);
if (right) right -> set_var(X);
        }
};

//------------------------------------------------------------------------------------------------------------

class Var:public Telement
{
double x; 
public:
Var(double X = O):Telement(NULL, NULL)
{x = X;) 
double rezult(void)
{return x;}
Telement* copy(void)
{return new Var(x);}
Telement* differ(void)
{return new Real(1.0);} 
void set_var(double X) {x = X;}
};


вот. вроде бы как set_var переопределяется в классе Var но она не выполняется, я вставлял туда MessageBox,
Ни какого сообщения я не увидел, тоесть ветка в дереве типа Var остается со значением 0, которое дается ей в конструкторе.
Немогу понять вроде бы все правильно написал, остальные переопределенные функции работают, а ета не хочет.
Помогите разобраться пожалуйсто.
Спасибо


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
likehood
Дата 4.12.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



покажи код, в котором вызывается эта функция и где создается объект класса Var
PM MAIL   Вверх
bsa
Дата 4.12.2007, 00:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Vetos, пожалуйста форматируй код, а то читать невозможно!
PM   Вверх
Alek86
Дата 4.12.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Код
Var(double X = O)


это прикол такой смешной?


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


Опытный
**


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

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



Alek86, Не вижу приколов;) Значение по-умолчанию 0.
PM MAIL   Вверх
Vetos
Дата 6.12.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот код в котором вызывается функция
Код

void __fastcall TForm1::B1Click(TObject *Sender)
{
TElement* x  = form(E1->Text);
TElement* f  = form(E2->Text);
TElement* f1 = f->differ();
TElement* f2 = f1->differ();
double X=x->rezult();
MessageBox(NULL,"j","mda",MB_OK);
f->Set_var(X);
f1->Set_var(X);
f2->Set_var(X);
MessageBox(NULL,"P","mda",MB_OK);
int precision=15;
int digits=StrToFloat(CSE1->Text);
E3->Text=FloatToStrF(x->rezult(),ffFixed,precision,digits);
E4->Text=FloatToStrF(f->rezult(),ffFixed,precision,digits);
E5->Text=FloatToStrF(f1->rezult(),ffFixed,precision,digits);
E6->Text=FloatToStrF(f2->rezult(),ffFixed,precision,digits);
}



--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Vyacheslav
Дата 7.12.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну   а что такое  Real ? 
Ну и где код  функции 
TElement* form( AnsiString )?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Alek86
Дата 7.12.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



HappyLife, не 0, а O

Добавлено @ 17:56
он 100% даже не компилил

Это сообщение отредактировал(а) Alek86 - 7.12.2007, 17:57


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


Опытный
**


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

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



Вот полный код программы, хотя ошибка только в этой функции.
Эта прога находит прозводную уравнения с помощью функции differ,для этого формируется базовый класс TElement.
На базе этого класса создаются классы чисел, операций, переменных.И вот как раз класс переменной не присваивает значение.
Подробное описание этих классов, и со всей ихней логикой находится в приклепленном файле.
Программа: 
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
int igg=0;
class TElement{
protected:
TElement *left, *right;
TElement(TElement* L,TElement* R)
{
left=L;right=R;
}
public:
~TElement(void){delete left;delete right;}
virtual double rezult(void){};
virtual TElement* copy(void){};
virtual TElement* differ(void){};
   virtual void Set_var(double X)
   {
   if (left) left->Set_var(X);
   if (right)right->Set_var(X);
   }
};
class Real: public TElement{
double f;
public:
  Real(double F):TElement(NULL,NULL){f=F;}
  double rezult(void)
   {
   return f;
   }
  TElement* copy(void){return new Real(f);}
  TElement* differ(void){return new Real(0);}
};
class Var: public TElement{
double x;
public:
 Var(double X=1):TElement(NULL,NULL){x=X;}
 double rezult(void)
 {return x;}
 TElement* copy(void)
 {return new Var(x);}
 TElement* differ(void)
 {return new Real(1.0);}
 void Set_var(X){x=X;}
};

struct Plus:public TElement{
Plus(TElement* L,TElement* R):TElement(L,R){};
double rezult(void){
return left->rezult()+right->rezult();}
TElement* copy(void){
return new Plus(left->copy(),right->copy());}
TElement* differ(void){
return new Plus(left->differ(),right->differ());}
};

struct Minus:public TElement{
Minus(TElement* L,TElement* R):TElement(L,R){};
double rezult(void){
return left->rezult()-right->rezult();}
TElement* copy(void){
return new Minus(left->copy(),right->copy());}
TElement* differ(void){
return new Minus(left->differ(),right->differ());}
};

struct Mult:public TElement{
Mult(TElement* L,TElement* R):TElement(L,R){};
double rezult(void)
{return left->rezult()*right->rezult();}
TElement* copy(void)
{return new Mult(left->copy(),right->copy());}
TElement* differ(void)
{return new Plus(new Mult(left->differ(),right->differ()),new Mult(left->copy(),right->differ()));}
};

struct Div:public TElement{
Div(TElement* L,TElement* R):TElement(L,R){};
double rezult(void)
{return left->rezult()/right->rezult();}
TElement* copy(void)
{return new Div(left->copy(),right->copy());}
TElement* differ(void)
{return new Div(new Minus(new Mult(left->differ(),right->copy()),
                          new Mult(left->copy(),right->differ())),
                          new Mult(right->copy(),right->copy()));
}
};

int PosFromEnd(AnsiString s,AnsiString sub)
{
int I=s.Length();
AnsiString p;
p.SetLength(I);
for (int i=1;i<=I;i++)
  p[I-i+1]=s[i];
if (p.Pos(sub)>0)
  return I-p.Pos(sub)+1;
  else return 0;
};
TElement* form(AnsiString s){
TElement* h;
int p,I=s.Length();
AnsiString s1,s2;
if((p=PosFromEnd(s,"+"))>1)
  {
   s1=s.SubString(1,p-1);
   s2=s.SubString(p+1,I-p);
   h=new Plus(form(s1),form(s2));
  }
  else if ((p=PosFromEnd(s,"-"))>1)
     {
      s1=s.SubString(1,p-1);
      s2=s.SubString(p+1,I-p);
      h=new Minus(form(s1),form(s2));
     }
     else if((p=PosFromEnd(s,"*"))>1)
        {
         s1=s.SubString(1,p-1);
         s2=s.SubString(p+1,I-p);
         h=new Mult(form(s1),form(s2));
        }
        else if ((p=PosFromEnd(s,"/"))>1)
            {
             s1=s.SubString(1,p-1);
             s2=s.SubString(p+1,I-1);
             h=new Div(form(s1),form(s2));
            }
            else if (s=="x") h=new Var();
              else h=new Real(StrToFloat(s));
              return h;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::B2Click(TObject *Sender)
{
exit(1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B1Click(TObject *Sender)
{
TElement* x  = form(E1->Text);
TElement* f  = form(E2->Text);
TElement* f1 = f->differ();
TElement* f2 = f1->differ();
double X=x->rezult();
MessageBox(NULL,"j","mda",MB_OK);
f->Set_var(X);
f1->Set_var(X);
f2->Set_var(X);
MessageBox(NULL,"P","mda",MB_OK);
int precision=15;
int digits=StrToFloat(CSE1->Text);
E3->Text=FloatToStrF(x->rezult(),ffFixed,precision,digits);
E4->Text=FloatToStrF(f->rezult(),ffFixed,precision,digits);
E5->Text=FloatToStrF(f1->rezult(),ffFixed,precision,digits);
E6->Text=FloatToStrF(f2->rezult(),ffFixed,precision,digits);
}
//---------------------------------------------------------------------------



Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  ___7.doc 96,00 Kb


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
bsa
Дата 8.12.2007, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Vetos, я переформатировал твой код. Пожалуйста, делай это сам.
Код
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
int igg=0;
class TElement{
protected:
    TElement *left, *right;
    TElement(TElement* L,TElement* R) {
        left=L;right=R;
    }
public:
    ~TElement(void) {
        delete left;
        delete right;
    }
    virtual double rezult(void){}
    virtual TElement* copy(void){}
    virtual TElement* differ(void){}
    virtual void Set_var(double X) {
        if (left)
            left->Set_var(X);
        if (right)
            right->Set_var(X);
    }
};
class Real: public TElement{
    double f;
public:
    Real(double F):TElement(NULL,NULL){f=F;}
    double rezult(void) {
        return f;
    }
    TElement* copy(void) {
        return new Real(f);
    }
    TElement* differ(void) {
        return new Real(0);
    }
};
class Var: public TElement{
    double x;
public:
    Var(double X=1):TElement(NULL,NULL){x=X;}
    double rezult(void) {
        return x;
    }
    TElement* copy(void) {
        return new Var(x);
    }
    TElement* differ(void) {
        return new Real(1.0);
    }
    void Set_var(X) {
        x=X;
    }
};

struct Plus:public TElement{
    Plus(TElement* L,TElement* R):TElement(L,R){};
    double rezult(void) {
        return left->rezult()+right->rezult();
    }
    TElement* copy(void) {
        return new Plus(left->copy(),right->copy());
    }
    TElement* differ(void) {
        return new Plus(left->differ(),right->differ());
    }
};

struct Minus:public TElement{
    Minus(TElement* L,TElement* R):TElement(L,R){};
    double rezult(void) {
        return left->rezult()-right->rezult();
    }
    TElement* copy(void){
        return new Minus(left->copy(),right->copy());
    }
    TElement* differ(void){
        return new Minus(left->differ(),right->differ());
    }
};

struct Mult:public TElement{
    Mult(TElement* L,TElement* R):TElement(L,R){};
    double rezult(void) {
        return left->rezult()*right->rezult();
    }
    TElement* copy(void) {
        return new Mult(left->copy(),right->copy());
    }
    TElement* differ(void) {
        return new Plus(new Mult(left->differ(),right->differ()),new Mult(left->copy(),right->differ()));
    }
};

struct Div:public TElement{
    Div(TElement* L,TElement* R):TElement(L,R){};
    double rezult(void) {
        return left->rezult()/right->rezult();
    }
    TElement* copy(void) {
        return new Div(left->copy(),right->copy());
    }
    TElement* differ(void) {
        return new Div(    new Minus(new Mult(left->differ(),right->copy()),
                      new Mult(left->copy(),right->differ())),
                new Mult(right->copy(),right->copy()));
    }
};

int PosFromEnd(AnsiString s,AnsiString sub)
{
    int I=s.Length();
    AnsiString p;
    p.SetLength(I);
    for (int i=1;i<=I;i++)
        p[I-i+1]=s[i];
    if (p.Pos(sub)>0)
        return I-p.Pos(sub)+1;
    else return 0;
};
TElement* form(AnsiString s){
    TElement* h;
    int p,I=s.Length();
    AnsiString s1,s2;
    if ( (p=PosFromEnd(s,"+") ) > 1) {
        s1=s.SubString(1, p-1);
        s2=s.SubString(p+1, I-p);
        h=new Plus(form(s1),form(s2));
    } else if ((p=PosFromEnd(s, "-")) > 1) {
        s1=s.SubString(1, p-1);
        s2=s.SubString(p+1, I-p);
        h=new Minus(form(s1), form(s2));
    } else if((p=PosFromEnd(s, "*")) > 1) {
        s1=s.SubString(1, p-1);
        s2=s.SubString(p+1, I-p);
        h=new Mult(form(s1), form(s2));
    } else if ((p=PosFromEnd(s, "/")) > 1) {
        s1=s.SubString(1, p-1);
        s2=s.SubString(p+1, I-1);
        h=new Div(form(s1), form(s2));
    } else if (s=="x") 
        h=new Var();
    else
        h=new Real(StrToFloat(s));
    return h;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::B2Click(TObject *Sender)
{
    exit(1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B1Click(TObject *Sender)
{
    TElement* x  = form(E1->Text);
    TElement* f  = form(E2->Text);
    TElement* f1 = f->differ();
    TElement* f2 = f1->differ();
    double X=x->rezult();
    MessageBox(NULL,"j","mda",MB_OK);
    f->Set_var(X);
    f1->Set_var(X);
    f2->Set_var(X);
    MessageBox(NULL,"P","mda",MB_OK);
    int precision=15;
    int digits=StrToFloat(CSE1->Text);
    E3->Text=FloatToStrF(x->rezult(),ffFixed,precision,digits);
    E4->Text=FloatToStrF(f->rezult(),ffFixed,precision,digits);
    E5->Text=FloatToStrF(f1->rezult(),ffFixed,precision,digits);
    E6->Text=FloatToStrF(f2->rezult(),ffFixed,precision,digits);
}
//---------------------------------------------------------------------------
Помоему, стало читабельней.
PM   Вверх
Vetos
Дата 8.12.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Та причем тут код, я вообще не вижу разницы, разве это важно. Важно то что не работает эта дурацкая функция, с точки синтаксиса все написано верно? Ничего не упущено? Почему не работает?  smile 


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
JackYF
Дата 8.12.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Vetos @  8.12.2007,  00:40 Найти цитируемый пост)
И вот как раз класс переменной не присваивает значение.

Строку класса, строку вызова - в студию.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Vetos
Дата 8.12.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Строку класса, строку вызова - в студию.

Вот класс:
Код

class Var:public Telement
{
double x; 
public:
Var(double X = O):Telement(NULL, NULL)
{x = X;) 
double rezult(void)
{return x;}
Telement* copy(void)
{return new Var(x);}
Telement* differ(void)
{return new Real(1.0);} 
void set_var(double X) {x = X;}


Вот вызов:
Код

Telement*x =form(Edit1->Text);
Telement* f = form(Edit2->Text);
Telement* f1 = f -> differ();
Telement* f2 = f1 -> differ();
double X = x -> rezult();
f -> set_var( X);
f1 -> set_var( X );
f2 -> set_var( X);

Я уже писал все это выше


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
likehood
Дата 8.12.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



А ты уверен, что у тебя создается объект класса Var? (вдруг у тебя ошибка в функции form). Проверь это отладчиком.

Кстати, в полном тексте прогрммы у тебя функция Set_var написана с ошибкой (не стоит тип перед X):
Код

void Set_var(X){x=X;}

хотя в первом посте все верно.
PM MAIL   Вверх
mes
Дата 8.12.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Vetos @  8.12.2007,  14:50 Найти цитируемый пост)
Вот вызов: ...
Я уже писал все это выше

по коду не видно какой именно класс у вас создается.. Вы приводите код по созданию класса по имени ; однако самого имени не указываете.. А вас просили привести именно код явного создания объекта:

Цитата(likehood @  4.12.2007,  00:20 Найти цитируемый пост)
покажи код, в котором вызывается эта функция и где создается объект класса Var


Цитата(Vetos @  8.12.2007,  11:15 Найти цитируемый пост)
 с точки синтаксиса все написано верно?

на беглый взгляд: функция Set_var переопределена только для класса Var
а не работает скорей всего потому, что создаются объекты других классов. 
(Может они  планировались потомками класса Var ? )


Это сообщение отредактировал(а) mes - 8.12.2007, 16:20


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


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

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