Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / переопределение функции класса / 8 сообщений из 8, страница 1 из 1
08.08.2005, 14:23
    #33205767
Имя пользователя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
у меня есть форма Fgrid. на ней есть кнопка Button4, в обработчике которой содержится

ShowMessage("ааа");

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

мне это видится так:

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

пробую так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class newf : TFgrid
  {
   public:
   void __fastcall Button4Click(void)
     {
      ShowMessage("bbb");
     };
   newf();
  };

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

но проблема в том, что новая форма не унаследовала метод Show().
что я сделал не правильно?
...
Рейтинг: 0 / 0
08.08.2005, 15:18
    #33205924
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <iostream> 

class C1
{
public:
	virtual void Show(void) {std::cout << "hello from C1\n"; }
};

class C2 : public C1
{
public:
	virtual void Show(void) {std::cout << "hello from C2\n"; }
};

int main()
{
	C1 c1;
	c1.Show();

	C2 c2;
	c2.Show();
	
	C1 *pc2 = new C2;
	pc2->Show();
	
	C1 &refc2 = c2;
	refc2.Show();

	delete pc2;

	return  0 ;
}

hello from C1
hello from C2
hello from C2
hello from C2
...
Рейтинг: 0 / 0
08.08.2005, 15:34
    #33205971
Имя пользователя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
спасибо. в моем примере я вроде делал также, тока не указал public
теперь нужные мне методы видны, но теперь возникает ошибка компиляции:

[Linker Error] Unresolved external 'newf:: (huge)' referenced from C:\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'newf::newf()' referenced from C:\CBUILDER6\PROJECTS\UNIT1.OBJ

я компилирую в BCB6. вот полный листинг моей тестовой проги:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
  
 class newf : public TForm1
   {
    public:
    void __fastcall Button3Click(void)
      {
       ShowMessage("bbb");
      };
    newf();
   };
  newf *fn = new newf();


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{  /// кнопка закрытия формы     
 delete fn;
 Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{ // кнопка вывода тестового сообщения
 ShowMessage("aaa");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{ // показать новую форму
 fn->Show();
}


т.е. это форма. на ней 3 кнопки: открыть новую форму, закрыть, и вывести сообщение.

что не нравится компилятору? как поправить?
...
Рейтинг: 0 / 0
08.08.2005, 15:46
    #33206009
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
Билдера у меня нет, но ошибка видна невооруженным глазом.
Ты объявил конструктор для класса newf, а реализацию написать забыл.
Либо убери из описания класса строчку

Код: plaintext
1.
newf();

(тогда он будет сгенерен по умолчанию)

Или напиши тело конструктора. Так:

Код: plaintext
1.
newf() {/* все что угодно*/};

или за пределами описания класса:

Код: plaintext
1.
newf::newf() {/* все что угодно*/}
...
Рейтинг: 0 / 0
08.08.2005, 16:16
    #33206128
Имя пользователя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
опят не получается..
по умолчанию конструктор не генерится. поэтому я его и прописал вручную.
но когда я пишу так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
   class newf : public TForm1
   {
    public:
    void __fastcall Button3Click(void)
      {
       ShowMessage("bbb");
      };
    newf(){/*допустимо чтобы он был абсолютно пустым? или вставить чтонить типа int aaa = 5;*/};
   };

мне компилятор говорит, что

[C++ Error] Unit1.cpp(18): E2251 Cannot find default constructor to initialize base class 'TForm1'


а при такой записи:

newf::newf(); // (вне тела класса)
[C++ Error] Unit1.cpp(21): E2333 Class member 'newf::newf()' declared outside its class
...
Рейтинг: 0 / 0
08.08.2005, 17:02
    #33206155
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
Судя по сообщениям об ошибке, у класса TForm1 нет конструктора без параметров. Т.е. ситуация примерно следующая:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream> 

class C1
{
public:
	virtual void Show(void) {std::cout << "hello from C1\n"; }
	C1(int) {std::cout << "C1 ctor(int)\n";}

};

class C2 : public C1
{
public:
	virtual void Show(void) {std::cout << "hello from C2\n"; }
	C2(){std::cout << "C2 ctor(void)\n";}       /* 1 */
};

int main()
{
	C2 c2;
	return  0 ;
}


error C2512: 'C1' : no appropriate default constructor available

Надо добавить инициализацию базового класса, т.е. написать вместро строки помеченной /* 1 */ так:

Код: plaintext
C2() : C1( 0 ) {std::cout << "C2 ctor(void)\n";}  /* 1 */ 


Но лучше в производном классе поддержать интерфейс базового, т.е. предоставить по крайней мере не меньший набор конструкторов, чем у родителя:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#include <iostream> 

class C1
{
public:
	virtual void Show(void) {std::cout << "hello from C1\n"; }
	C1(int n) {std::cout << "C1 ctor(int)" << n << std::endl;}
};

class C2 : public C1
{
public:
	virtual void Show(void) {std::cout << "hello from C2\n"; }
	C2() : C1( 0 ) {std::cout << "C2 ctor(void)\n";}
	C2(int n) : C1(n) {std::cout << "C2 ctor(int)" << n << std::endl;}

};

int main()
{
	C2 c( 10 );
	C2 cc;

	return  0 ;
}

Какие точно параметры требует твой случай, т.е. конструкторы класса TForm1, посмотри сам.
...
Рейтинг: 0 / 0
08.08.2005, 18:03
    #33206309
Имя пользователя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
конструктор класса TForm описан как
__fastcall TForm1(TComponent* Owner);
как я понял конструктор производного класса тоже должен иметь параметр того же типа?

попробовал сделать так:

newf(TComponent* c1): TForm1(c1) {}

[C++ Error] Unit1.cpp(19): E2113 Virtual function 'newf::newf(TComponent *)' conflicts with base class 'TForm1'

переделал таким образом:

newf(): TForm1(0) {}

так работает. т.е. компилится и прога запускается.
как я понял эта запись означает что конструктором для класса newf() является конструктор TForm1() с параметром =0?

но возникла еще одна проблема:
я создаю экземпляр объекта

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

новое окно открывается, такое же как и исходное. но функция - обработчик кнопки - не переопределилась. т.е. то чего я пытался добиться - не работает.
...
Рейтинг: 0 / 0
09.08.2005, 13:10
    #33206663
Имя пользователя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переопределение функции класса
все заработало.

в переопределении функции добавил:

__published:
void __fastcall Button3Click(TObject *Sender);

redskin, большое спасибо за помощь!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / переопределение функции класса / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]