Variablen zwischen zwei Klassen austauschen

FJK

Erfahrenes Mitglied
hallo

noch ne andere Frage

ich habe zwei Klassen

Klasse A und Klasse B aber beide sind nicht miteinander verwand
so Klasse A will jetzt eine Variable haben von Klasse B
also

b = KlasseB->Variable;

die Unith ist natürlich includet und Klasse A als friend class deklaried
und die Klasse B ist erschaffen (bevor Klasse A erschaffen wird).
nun kommt aber bei dem aufruf der Funktion eine Fehlermeldung via zugriffsverletzung auf speicher, das selbe kommt auch wenn die klassen verwand sind und ich die Variable vererben will

kann sein das ich das Falsch verstanden und es garnicht geht aber wie kann es dann regeln
 
Zuletzt bearbeitet:
ähm ich arbeite in borland builder 5.0 c++

der Quelltext ist zu lang um ihn hier zu posten

es geht darum einen integer an eine ander Klasse zu übergeben damit die Klasse weitere Berechnungen durchführen kann

wenn ihr wirklich einen Quellcode braucht denke ich mir noch einen aus
 
Zuletzt bearbeitet:
Ich hab doch gesagt nicht DEN Quellcode sondern ein Minimalbeispiel wo das Problem auftritt oder klar wird was du vor hast.

Gruß
 
Klasse A errechnet einen integer r
Klasse A ruft eine Funktion auf Klasse B->rechnen(r);
Klasse B bekommt die variable und soll damit weiterrechnen und dann ausgeben
 
Zuletzt bearbeitet:
Hi.

Du mußt uns wirklich schon Quelltext zeigen - deine Beschreibung ist zu oberflächlich. Ich frage mich warum du das nicht gleich machst, oder zumindest dann nachdem dich FireFlow 2mal danach gefragt hat?! :confused:

Gruß
 
hallo

A.h
Code:
//---------------------------------------------------------------------------

#ifndef UAH
#define UAH
#include "UE.h"

//---------------------------------------------------------------------------
class TA
{
 protected: 
               int i;
 public:
         TA(int i);
         void rechnen(void);
};
#endif

A.cpp
Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UA.h"
#include "US.h"
#include "UE.h"

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

#pragma package(smart_init)
TE *E;
//================================================================TA::TA(int Eini)
{
 i = Ein i;
}
//================================================================
void TA::rechnen(void)
{
 i++;
  E->geben(i);
}
//================================================================

E.h
Code:
//---------------------------------------------------------------------------

#ifndef UEH
#define UEH
//---------------------------------------------------------------------------
class TE
{
friend class TA;

 protected:
         int B;

 public:
         TE();
         void geben (int i);
};

#endif

E.cpp
Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UE.h"
#include "US.h"

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

#pragma package(smart_init)
//================================================================
TE::TE()
{
  B = 1000000;
}
//================================================================
void TE::geben(int i)
{
B = B*i;
}
//================================================================



S.cpp
Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "US.h"
#include "UA.h"
#include "UE.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
TE *E;
TA *A;

//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
 E = new TE();
 A = new TA(1);
 Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
 A->rechnen();
}

das problem tritt auf wenn rechnen aufgerufen wird
abgeschwächter quellcode, da das "original" mehrere seiten lang ist
 
Zuletzt bearbeitet:
Hi.

Wie lautet denn die Fehlermeldung genau? Du bekommst du Fehlermeldung zur Laufzeit, ja? Dann ist vermutlich irgendein Zeiger nicht richtig initialisiert. Hast du denn schonmal mit einem Debugger geschaut wo genau das Problem ist und welchen Wert die einzelnen Variablen (vor allen Dingen Pointer) haben?
 
Du hast die Variable E 2-fach definiert. Einmal in A.cpp und dann nochmal in S.cpp. Also eigentlich ist sowas in C++ verboten und der Compiler (bzw. Linker) hätte sich da beschweren sollen...

Du könntest z.B. alle übrigen Definitionen von E entfernen und dann

E.h
Code:
extern TE* E;

E.cpp
Code:
TE* E;

Übrigens brauchst du dafür die Klasse TA nicht als friend von TE deklarieren. Mit Zugriffsrechten auf die einzelnen Elemente hat das nämlich nichts zu tun. Da hätte sich der Compiler schon beschwert und sich geweigert dein Programm zu übersetzen.

PS: Was bedeutet eigentlich das #pragma package(smart_init)?

/edit:
FJK hat gesagt.:
kann man bilder hochladen?
Ja, man kann. (Button "Anhänge verwalten")
 
FJK hat gesagt.:
das weiß ich auch nicht, das schreibt Borland auch selber wenn man eine neue Unit hinzufügt
:rtfm: :
"Mit #pragma package(smart_init) stellen Sie sicher, daß Units eines Packages in der durch ihre Abhängigkeiten festgelegten Reihenfolge initialisiert werden"
 
Zurück