CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Klasy Konstruktor

Klasy Konstruktor

dział ogólny

Klasy Konstruktor

Nowy postprzez Frytek18 » piątek, 25 maja 2012, 13:06

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
class trojkat
{
private:
        double bok1;
        double bok2;
        double bok3;
public:
                trojkat();
                trojkat(float a, float b, float c);
                float obwd() ;
                float pole() ;
                void spr () ;
};
//--------------------------------------------------------------------------------
trojkat dane;
//--------------------------------------------------------------------------------
trojkat::trojkat()
{
}
//--------------------------------------------------------------------------------
trojkat::trojkat(float a, float b, float c)
{
        bok1==a;
        bok2==b;
        bok3==c;
}
//--------------------------------------------------------------------------------
float trojkat::obwd(){

        float suma1=0;
        suma1=bok1+bok2+bok3;
        return(suma1);
}
//--------------------------------------------------------------------------------
float trojkat::pole(){

  float polowa=0;
  float pole_s=0;
  polowa=(bok1+bok2+bok3)/2;
  pole_s=sqrt(polowa*(polowa-bok1)*(polowa-bok2)*(polowa-bok3));
  return(pole_s);
}
void trojkat::spr()
{

        if ((bok1<0)||(bok2<0)||(bok3<0)){
                MessageBox(NULL, "Długosc nie może byc ujemna!!!", NULL, MB_ICONWARNING);
                }

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{

try{
trojkat(Edit1->Text.ToDouble(),Edit2->Text.ToDouble(),Edit3->Text.ToDouble());
}
catch(...){
MessageBox(NULL, "Upwenij sie czy aby napewno wpisałes liczbe!!!", NULL, MB_ICONWARNING);
}
dane.spr();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit4->Text=dane.pole();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit4->Text=dane.obwd();
}
//---------------------------------------------------------------------------

Mozesz mi powiedziec czemu nie działa procedura pole i obwód? Bo mam za pomoca konstruktora przypisać zmienne
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Klasy Konstruktor

Nowy postprzez Cyfrowy Baron » piątek, 25 maja 2012, 17:06

Frytek18 napisał(a):
KOD cpp:     UKRYJ  
        bok1==a;
        bok2==b;
        bok3==c;


bok1 jest równy a?! :shock: Zastanów się! bok1 ma się równać a, a nie być równym a! Powinno być:

KOD cpp:     UKRYJ  
                bok1 = a;
                bok2 = b;
                bok3 = c;




Frytek18 napisał(a):trojkat(Edit1->Text.ToDouble(),Edit2->Text.ToDouble(),Edit3->Text.ToDouble());


A co to niby ma być?! :shock: Odwołujesz się bezpośrednio do klasy, a nie do obiektu klasy, tutaj obiektem klasy jest obiekt dane. Nie wystarczy sama deklaracja:

KOD cpp:     UKRYJ  
trojkat dane;


na domiar wszystkiego nieprawidłowa. To nie jest struktura lecz klasa. Powinno być:

KOD cpp:     UKRYJ  
trojkat *dane;


Za deklaracją powinna iść definicja:

KOD cpp:     UKRYJ  
dane = new trojkat(Edit1->Text.ToDouble(),Edit2->Text.ToDouble(),Edit3->Text.ToDouble());


Rzecz w tym, że jeżeli zainicjujesz zmienne w konstruktorze klasy, a są to zmienne prywatne, to nie będziesz mógł zmienić im później wartości, gdyż konstruktora klasy dla danego obiektu można wywołać tylko raz, gdyż każde wywołanie tworzy nowy obiekt klasy, a jeżeli nazwa obiektu pozostaje niezmieniona, to masz do tego wyciek pamięci, gdyż poprzednie obiekty zostaną porzucone, więc przed ponownym wywołaniem takiego konstruktora należałby zniszczyć poprzedni obiekt, czyli:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if(dane != NULL) delete dane;
  dane = new trojkat(Edit1->Text.ToDouble(),Edit2->Text.ToDouble(),Edit3->Text.ToDouble());

  dane->spr();
}


Problem jednak w tym, że ty tworzysz obiekt w zdarzeniu OnClick dla przycisku Button1, jeżeli jednak ten przycisk nie zostanie wciśnięty, to obiekt nie będzie istniał i jeżeli wciśniesz np. Button2 to program będzie się odwoływał do obiektu, który nie istnieje co da błędy, dlatego obiekt powinieneś utworzyć nie w zdarzeniu OnClick dla przycisku Button1, lecz w konstruktorze klasy formularz Form1, a to try catch to sobie daruj , gdyż będzie to prowadzić do błędów jeżeli, któryś Edit będzie zawierał tekst zamiast liczby. Proponuję raczej coś takiego:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  double number;

  if( !TextToFloat(Edit1->Text.c_str(), &number, fvExtended) ||
          !TextToFloat(Edit2->Text.c_str(), &number, fvExtended) ||
          !TextToFloat(Edit3->Text.c_str(), &number, fvExtended)
    )
  {
        MessageBox(NULL, "Upwenij sie czy aby napewno wpisałes liczbe!!!", NULL, MB_ICONWARNING);
        return;
  }
  if(dane != NULL) delete dane;

  dane = new trojkat(Edit1->Text. ToDouble(), Edit2->Text.ToDouble(), Edit3->Text.ToDouble());


  dane->spr();
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Klasy Konstruktor

Nowy postprzez Frytek18 » poniedziałek, 28 maja 2012, 17:36

KOD cpp:     UKRYJ  
!TextToFloat(Edit3->Text.c_str(), &number, fvExtended)
mogłbys to wytłumaczyc mi co to znaczy z tym &numer, fvExtended bo tego nie czaje
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Klasy Konstruktor

Nowy postprzez Cyfrowy Baron » wtorek, 29 maja 2012, 09:30

To jest funkcja konwertująca zmienną typu char lub wchar_t na liczbę typu float. Jeżeli konwersja się powiedzie to funkcja zwraca wartość true w przeciwnym razie zwraca false.

KOD cpp:     UKRYJ  
bool __fastcall TextToFloat(System::WideChar * Buffer, void *Value, TFloatValue ValueType)/


System::WideChar * Buffer - podajesz łańcuch znaków który ma być poddany konwersji na liczbę.
void *Value - podajesz zmienną do której zostanie zapisana prze-konwertowana liczba, musi być typu Extended lub Currency.
TFloatValue ValueType - informacje o lokalizacji, czyli sposób zapisywania liczb zmiennopozycyjnych zdefiniowany w Opcjach regionalnych systemu.

Wykrzyknik przed funkcją oznacz, że warunek sprawdza czy funkcja zwraca wartość false, czy te dwa zapisy mają identyczne znaczenie:

KOD cpp:     UKRYJ  
if( !TextToFloat(Edit1->Text.c_str(), &number, fvExtended) )
if( TextToFloat(Edit1->Text.c_str(), &number, fvExtended) == float )
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości