C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
переопределение функций класса, ламерский вопрос по теории С++
trigger
  Отправлено: 08.08.2005, 10:29


Не зарегистрирован







подскажите пожалста
у меня есть класс. мне нужно, чтоб в одонм случае одна его функция выполняла одни действия, в другом другие. но не так чтобы там было куча условий. а както на уровне преопределения этой функции.
значит как я понимаю мне нужно создать новый класс-потомк от исходного и в определенни этого класса написать нужную мне функци. а потом создаю объект этого класса и юзаю его. я правильно понимаю всю логику?
т.е. пример:
есть форма. на ней кнопка. мне нужно создать 2 одинаковых формы, но чтоб в одном случае это кнопка выполняла одну функцию, а во втором — другую. помогите с примером плиз...
trigger
Отправлено: 08.08.2005, 11:09


Не зарегистрирован







есть форма Fgrid. на ней есть кнопка Button4, в обработчике которой содержится
CODE

ShowMessage("ааа");


я хочу сделать такую же форму, но с другим обработчиком этой же кнопки.
вот например написал вот так:
CODE

class newf : TFgrid
  {
   public:
   void __fastcall Button4Click(void)
     {
      ShowMessage("bbb");
     };
   newf();
  };

newf *fn = new newf();
fn->Show();

но проблема в том, что новая форма не унаследовала метод Show().
что я сделал не правильно? (возможно все? ))
esh
Отправлено: 08.08.2005, 13:23


Дежурный стрелочник

Группа: Участник
Сообщений: 71



class newf : public TFgrid
trigger
Отправлено: 08.08.2005, 14:05


Не зарегистрирован







QUOTE
class newf : public TFgrid


да. методы формы появились. спасибо за ответ. но теперь при компиляции возникает ошибка:

[Linker Error] Unresolved external '{803}...' referenced from GRID.OBJ
[Linker Error] Unresolved external '{803}...' referenced from GRID.OBJ

не подскажете в каком направении копать?

компилятор — BCB6



Георгий
Отправлено: 08.08.2005, 20:25


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



CODE
class abstractInterface{
public:
virtual void aFunction(void)=0;
};
class firstImplementation:public abstractInterface{
public:
void aFunction(void)
{
// make first action
};
};
class secondImplementation:public abstractInterface{
void aFunction(void)
{
// make second action
};
};

abstractInterface *ptr = 0;

// control function
void Switch(int type)
{
switch(type)
{
case 0:
delete ptr;
ptr=0;
break;
case 1:
ptr = new secondImplementation;
break;
default:
ptr=new firstImplementation;
};

// actionFunction
void Action(void)
{
if (ptr) ptr->aFunction();
};
trigger
Отправлено: 09.08.2005, 09:44


Не зарегистрирован







благодарю за ответы. вроде уловил суть но не до конца. вобщем у меня получился вот такой код. работающий, но не правильно. т.е. сама функция, которую я хочу переопределить — не переопределятся. если не влом — гляньте где ошибка...
CODE


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

class newform : public TForm1
 {
  public:
  void __fastcall Button3Click(TObject *Sender);
  newform():TForm1(Application) {};
 };
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // закрыть форму
Close();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // создать новую форму
 newform *fn = new newform();
 fn->Show();
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{ // исходный обработчик формы класса TForm1
 ShowMessage("aaa");
}
void __fastcall newform::Button3Click(TObject *Sender)
    { // тот обработчик который я хочу подставить
     ShowMessage("bbb");
    }


ps компилятор — BCB6, компилятор не мог создать конструктор по умолчанию, поэтому пришлось описать его самому в виде

newform():TForm1(Application) {};

может быть из-за этого не переопределяется функция?
Guest
Отправлено: 09.08.2005, 10:47


Не зарегистрирован







Проверено, работает (секция)
CODE

class newform : public TForm1
{
__published:
void __fastcall BitBtn2Click(TObject *Sender);
public:
newform() : TForm1(Application) {};
};

void __fastcall newform::BitBtn2Click(TObject *Sender)
{ ShowMessage("newform"); }

newform *nfrm = NULL;

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

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
if (nfrm)
{  if (nfrm->Visible) nfrm->Close();
   delete nfrm;
   nfrm = NULL;
   return;
}

nfrm = new newform();
nfrm->Show();
}
//---------------------------------------------------------------------------
trigger
Отправлено: 09.08.2005, 11:10


Не зарегистрирован







о! четко!
заработало! ))

спасибо большое! надо было мне объявить новую функцию как паблишт.
Георгий
Отправлено: 09.08.2005, 20:55


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



только delete не забывай делать

Вернуться в Вопросы программирования в C++Builder