Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Klasse in bcb

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.10.2005, 01:43 Uhr
~Tom_aus_Chemnitz
Gast



C++:
class xyz:
{
public:
       __property int ID = {read=GetID, write=SetID};
       void      __fastcall SetID              (int value) {ID = value;};
       int       __fastcall GetID              (void) {return ID;};
};



jedes mal, wenn ich die beiden Funktionen aufrufe, kommt eine Fehlermeldung: "Stack-Überlauf" oder so was in der Richtung...

Zu meiner Frage: Weiß irgendjemand, was ich falsch gemacht habe?
Bevor jemand fragt: ist alles public, weil SetID() auch von außerhalb der Klasse aufgerufen wird - auch, wenn man das normalerweiße nicht so machen sollte - aber ich hoffe mal nicht, dass der Fehler da liegt?!?

Ciao Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.10.2005, 01:46 Uhr
~Tom_aus_Chemnitz
Gast


hab natürlich vergessen, zu sagebm, dass ich mit Borland C++ Builder arbeite :/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.10.2005, 10:43 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

1. Falsches Forum -> ich annektier den Thread
2. Wenn Du "ID=value;" sagst, wird intern die SetID-Methode aufgerufen, die ruft sich wieder auf... eine unendliche Rekursion, und irgendwann ist der Stack halt voll. Du brauchst noch eine private-Variable, die die tatsächlichen Daten enthält, z.B.


C++:
class xyz:
{
private:
       int mID;
public:
       __property int ID = {read=GetID, write=SetID};
       void      __fastcall SetID              (int value) {mID = value;};
       int       __fastcall GetID              (void) {return mID;};
};


--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.10.2005, 14:01 Uhr
~Tom_aus_Chemnitz
Gast


danke - das klingt natürlich logisch - mal gucken, ob es so auch geht...
Jetzt kommt aber ne Zugriffsverletzung... :/
ich ruf sie so auf: (in ner anderen Klasse, falls es daran liegen könnte):


C++:
      Form1->Options->SetID(x);
      Form1->Options->ShowDetails();



Ciao - danke noch mal und schon mal ^^ Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.11.2005, 15:03 Uhr
~Gast
Gast



C++:
class xyz
{
       __property int ID = {read = GetID, write = SetID};
public:
       void      __fastcall SetID              (int value) {};
       int       __fastcall GetID              (void) {};
}



müsste das nicht wenigstens funktionieren?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.11.2005, 15:14 Uhr
~Gast
Gast



C++:
class xyz
{
       __property int ID = {read = GetID, write = SetID};
public:
       void      __fastcall SetID              (int value) {};
       int       __fastcall GetID              (void) {};
};



jetzt gibt es zwar keine Fehler mehr, aber so richtig zu funktionieren scheint es immer noch nicht :/ bei dem oberen kommt wie gesagt bzw. geschrieben, immer eine Zugriffsverletzung - egal, obs in private oder public deklariert ist...

Danke noch mal...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.11.2005, 02:03 Uhr
~Tom_aus_Chemnitz
Gast



C++:
class xyz
{
public:
                 __property int ID =           {read=GetID, write=SetID};
       int vID;
       void      __fastcall SetID              (int value) {vID = value;};
       int       __fastcall GetID              (void) {return vID;};
};



ich habe jetzt so gar alles als public definiert und trotzdem kommt immer eine Zugriffsverletzung.... :/

Aufrufen tu ich sie so:

zum schreiben: Form1->xyz->ID = x;
bzw zum lesen: x = Form1->xyz->ID;


Die Zugriffsverletzung kommt beim Schreiben immer in der 6. und beim Lesen immer in der 7. Zeile (zumindest in dem Stück Code da oben müssten die Zeilenangaben stimmen)

Danke für eure Hilfe schon mal!

Ciao Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.11.2005, 10:12 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
eigentlich brauchst Du nur die Eigenschaft public zu machen, da Set und Get ja intern dadurch aufgerufen werden. Bsp:

C++:
class xyz
{
public:
   __property int ID ={read=GetID,  write=SetID};
private:
      int vID;
      void __fastcall SetID (int value){vID = value;};
      int __fastcall GetID (void){return vID;};
};


Aufruf:

C++:
  xyz XYZ;
  XYZ.ID = 5;
  int id =XYZ.ID;
  // oder
  xyz* pXYZ = new xyz;
  pXYZ->ID = 9;
  int pId =pXYZ->ID;


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.11.2005, 15:28 Uhr
~Tom_aus_Chemnitz
Gast


es kommt immer noch diese Zugriffsverletzung...
Ich mal nen neues Projekt angefangen, um dir dann einfach alles zu zeigen ^^

Header-Datei:


C++:
class xyz
{
public:
   __property int ID ={read=GetID,  write=SetID};
private:
      int vID;
      void __fastcall SetID (int value){vID = value;};
      int __fastcall GetID (void){return vID;};
};

class TForm1 : public TForm
{
__published:    // Von der IDE verwaltete Komponenten
        TButton *Button1;
        TEdit *Edit1;
        TEdit *Edit2;
        void __fastcall Button1Click(TObject *Sender);
private:    // Anwender-Deklarationen
public:        // Anwender-Deklarationen
        __fastcall TForm1(TComponent* Owner);
        xyz *XYZ;
};


die cpp-Datei:

C++:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
XYZ->ID = StrToInt(Edit2->Text);
Edit1->Text = IntToStr(XYZ->ID);
}



Danke für deine Mühen :o)

Ciao Tom
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.11.2005, 17:33 Uhr
Bruder Leif
dances with systems
(Operator)


*grins* Jetzt ist alles klar. "XYZ" ist ein Zeiger auf ein Objekt, es wird aber nirgends eins angelegt. Der Zeiger zeigt ins Nirgendwo, und sobald Du auf die ID zugreifen willst, versuchst Du, irgendeinen Speicherbereich zu überschreiben => Zugriffsverletzung.
Bau in den Konstruktor von Form1 ein "XYZ = new xyz();" ein, in den Destruktor ein "delete XYZ;", dann sollte das laufen!
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: