# Variablen zwischen zwei Klassen austauschen



## FJK (3. Oktober 2005)

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


----------



## FireFlow (3. Oktober 2005)

Kurzer Beispielcode wo das problem auftritt wär angebracht.   

Gruß


----------



## FJK (3. Oktober 2005)

ä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


----------



## FireFlow (3. Oktober 2005)

Ich hab doch gesagt nicht DEN Quellcode sondern ein Minimalbeispiel wo das Problem auftritt oder klar wird was du vor hast.

Gruß


----------



## FJK (3. Oktober 2005)

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


----------



## deepthroat (3. Oktober 2005)

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?! 

Gruß


----------



## FJK (4. Oktober 2005)

hallo

A.h

```
//---------------------------------------------------------------------------

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

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

A.cpp

```
//---------------------------------------------------------------------------

#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

```
//---------------------------------------------------------------------------

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

 protected:
         int B;

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

#endif
```

E.cpp

```
//---------------------------------------------------------------------------

#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

```
//---------------------------------------------------------------------------

#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


----------



## deepthroat (4. Oktober 2005)

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?


----------



## deepthroat (4. Oktober 2005)

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
	
	
	



```
extern TE* E;
```

E.cpp
	
	
	



```
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")


----------



## Test (5. Oktober 2005)

FJK hat gesagt.:
			
		

> das weiß ich auch nicht, das schreibt Borland auch selber wenn man eine neue Unit hinzufügt


  :
"Mit #pragma package(smart_init) stellen Sie sicher, daß Units eines Packages in der durch ihre Abhängigkeiten festgelegten Reihenfolge initialisiert werden"


----------

