Builder 6 - Exception Problem.



  • Hi, ich habe ein kleines Probelm, beim Builder 6 und weis nicht mehr weiter.
    Und zwar möchte ich folgende Kalsse als Beispiel in meine Windows Anwendung einfügen.

    class TMyClass
    {
          private: 
              int a,b,c;
          public:
              int add(int,int,int) ;
    };
    
    int TMyClass::add(int d, int e, int f)
    {
    
              a=d;
              b=e;
              c=f;
              return a+b+c
    };
    

    Nur wenn ich jetzt das Programm starte und mit folgendem aufruf meine Methode auführen will bekomme ich eine exception

    TMyCalss *Class;
    Edit1->Text=IntToStr(Class->add(1,2,3));
    

    Dies ist nur ein Beispiel.
    Die Exception Luatet wie folgt.

    Project test.exe raised exception class EAccess Violation with Message 'Access vilation at Adress 00403A1D in module 'test.exe'. Write of Adress 550102EE'. Process Stopped. Use Step or run to continue.

    http://hannesk.mine.nu/webcam/exception.JPG

    Des weiteren habe ich gemerkt, wenn ich in die Klasse als Beispiel ein Feld mit den Dimensionen 120x160 :

    int ergebnis[120][160]
    

    erzeuge, der Builder aber ein Feld der Dimension 31555x160 aninmmt.
    http://hannesk.mine.nu/webcam/klassen_feld.JPG

    Ich hoffe mir kann jemand dabei helfen.



  • Hallo

    Du must noch eine gültige Instanz der Klasse anlegen. Und du brauchst einen Konstruktor für die Klasse, der die Membervariablen der Instanz beim erzeugen auf z.b. 0 setzt

    class TMyClass
    {
          private:
              int a,b,c;
          public:
              int add(int,int,int) ;
              TMyClass(); // Konstruktor einfügen
    };
    
    // Implementation des Konstruktors mit Initialisierungsliste der Membervariablen
    TMyClass::TMyClass() : a(0), b(0), c(0)
    {
      }
    
    ...
    TMyCalss *Class = new TMyClass(); // Instanz von TMyClass erzeugen
    Edit1->Text=IntToStr(Class->add(1,2,3)); // Instanz verwenden
    ...
    delete Class; // Instanz nach Gebrauch löschen
    

    bis bald
    akari



  • Du benötigst ein konkretes Objekt vom Typ MyClass, um eine Methode aufzurufen, nicht einen (mehr oder weniger) zufällig gelegenen Speicherbereich, den du als MyClass interpretierst (und das machst du mit dem uninitialisierten Zeiger):

    MyClass *Class=new MyClass;//JETZT hast du ein Objekt
    Edit1->Text=IntToStr(Class->add(1,2,3));
    //...
    
    delete Class;//Freigabe des Speichers
    

    (btw, über den Sinn dieser Klasse rede ich lieber nicht - die Add-Methode wäre als Funktion geeigneter ;))

    Edit: OK, ich war zu langsam 😉

    @akari: Default-Konstruktor ist nicht nötig, den stellt der Compiler notfalls selber bereit.



  • Ok, das hatte ich mir auch schon gedacht, nur dann kommt eine Meldung vom Linker, und zwar.

    Unresolved external 'TMyClass::add(int,int,int)' referenced from MainTest.obj.

    MainTest ist nun der Source für meine Oberfläche, in der ich die Klasse nutzen möchte. Ich habe auch schon mit

    extern *TMyClass MyClass
    

    versucht, jedoch kam wieder der Fehler.

    Der Zweck dahinter ist natürlich ein größeres Projekt, welches aber nun zu Umfangreich ist, um hier genauer auf gesschlüsselt zu werden.



  • FAQ

    Gruß,

    Alexander



  • Hallo

    CStoll schrieb:

    @akari: Default-Konstruktor ist nicht nötig, den stellt der Compiler notfalls selber bereit.

    Ja... aber dann werden die Member-Variablen nicht initialisiert. Dann stehen in a,b und c irgendwelche Werte drinne, was bei der sinnfreien Methode auch nicht auffällt. Aber spätestens dann wenn die Methode z.B. so aussieht

    int TMyClass::add(int d, int e, int f)
    {
    
              a+=d;
              b+=e;
              c+=f;
              return a+b+c
    };
    

    fällt es auf. Also besser immer in einem Konstruktor die Member ordentlich initialisieren.

    bis bald
    akari


Anmelden zum Antworten