Globales Klassenobjekt

m-a-g

Grünschnabel
Hi,
ich bin absolut am Ende mit meinem kleinen Lateinwissen =).
Hoffentlich kann mir hier jemand helfen.

Ich programmiere mit VC++


Aber nun zu meinem Problem:
Ich programmiere ein WindowsForms - Projekt mit mehreren Fenstern.
Es gibt ein Fenster in der eine Oberfläche eingelesen wird. Klingt komplizierter als es ist. Die Oberflächendatei ist nichts anderes als eine Matrix (z.b. 200x200). Und genau hierum geht es. Diese eingelesene Datei befindet sich in einem Objekt, welches ich auch aus anderen Fenstern und Funktionen aufrufen will.
Bisher habe ich direkt vorm Einlesen so definiert:
Code:
CGitter **Gitter_1;

Gitter_1 = new CGitter*[index_max+1];

for(int i=0;i<=9;i++)
{
	Gitter_1[i] = new CGitter();
}

Gitter_1[index-1]->Matrix_erstellen();

Kurze Erläuterung dazu:
CGitter ist eine Klasse mit Methoden wie "Matrix_erstellen" dir mir das abnehmen, weil man eben sehr viele Oberflächen importieren soll, die dann in dem Array Gitter_1[i] abzurufen sind.
Aber leider weiß ich nicht wie ich dieses Klassenobjekt Gitter_1[i] so definiere dass es überall verfügbar ist. Das Problem ist ja auch, dass ich mehrere Dateien habe Form1.h, Import.cpp usw.

PS: Wie ihr an dem strukturlosen quark da oben sicher erkennt, bin ich ein blutiger Anfänger, also seid bitte nachsichtig :)
 
Zuletzt bearbeitet:
du könntest CGitter** Gitter_1 in einem cpp-file definieren, und in den cpp-Files, in denen du es benötigst, mittels
Code:
extern CGitter** Gitter_1;
deklarieren. Dann kannst du dort auf Gitter_1 ebenfalls zugreifen.

Alternativ könntest du eine wrapper-Klasse erstellen, in der der CGitter**-Pointer static definiert ist, un dann mit static-Methoden dieser Klasse darauf zugreifen:
Code:
class GitterWrapper
{

     public: 
          static CGitter* getGitter(int i){
             return gitter[i];
      }

     private: 
         static CGitter** gitter;

}

GitterWrapper::gitter = new CGitter*[MAX_GRID_NR];

Natürlich fehlt jetzt noch Constructor usw.

Du kannst daraus auch noch ein Singleton machen, führt aber jetzt wohl zu weit.

Gruß
Peter
 
Die obere Variante klingt gut. Denn so ähnlich habe ich es schon zum Laufen gekriegt.
Das Problem ist jetzt nur folgendes:

Wenn ich "extern CGitter** Gitter_1;" in meine Datei reinschreibe, dann fehlt der Datei die Information über das hier:
Code:
Gitter_1 = new CGitter*[index_max+1];

for(int i=0;i<=9;i++)
{
Gitter_1[i] = new CGitter();
}

Gitter_1[index-1]->Matrix_erstellen();

Also mein Programm weiß nichts davon, dass es nicht nur ein Zeiger auf ein Objekt ist, sondern auch noch ein Array. Wie krieg ich das unter? Auch überall noch ein "extern" vor? Das klappt nicht, oder?
 
Also mein Programm weiß nichts davon, dass es nicht nur ein Zeiger auf ein Objekt ist, sondern auch noch ein Array. Wie krieg ich das unter? Auch überall noch ein "extern" vor? Das klappt nicht, oder?
Ein Array ist nichts weiter als ein Zeiger. Dabei sollte es keine Probleme geben, voraussgesezt die Variable wurde bereits initialisiert.

Gruß
 
also in visual studio ist es so:

schreibe ich oben in den anfang der cpp-datei
Code:
extern CGitter** Gitter_1;

und dann

Code:
Gitter_1[index-1]->Matrix_erstellen();
so öffnet er mir nicht diese fenster nachdem ich den pfeil eingegeben habe (also nach "Gitter_1[index-1]->" passiert nichts

gebe ich aber vorher das hier noch ein:
Code:
Gitter_1 = new CGitter*[index_max+1];

for(int i=0;i<=9;i++)
{
Gitter_1[i] = new CGitter();
}


so öffnet er mir ein fenster mit allen attributen und methoden
 
also in visual studio ist es so:

schreibe ich oben in den anfang der cpp-datei
Code:
extern CGitter** Gitter_1;
und dann
Code:
"Gitter_1[index-1]->Matrix_erstellen();" so öffnet er mir nicht diese fenster nachdem ich den pfeil eingegeben habe (also nach "Gitter_1[index-1]->" passiert nichts

gebe ich aber vorher das hier noch ein:
Gitter_1 = new CGitter*[index_max+1];

for(int i=0;i<=9;i++)
{
Gitter_1[i] = new CGitter();
}

so öffnet er mir ein fenster mit allen attributen und methoden

Also, du hast zwei Dateien A.cpp und B.cpp, und du willst eine in A.cpp definierte globale Variable in B.cpp benutzen, dann mußt du die Variable (kann auch nur ein leerer Pointer sein!) in A.cpp anlegen und in B.cpp mit "extern" deklarieren. (informiere dich mal über den Unterschied zwischen Definition und Deklaration, außerdem über extern, externer im Gegensatz zu interner Bindung).

Wenn die globale Variable nur ein Pointer ist, dann mußt du natürlich erst mal ein Objekt bzw. Array erzeugen, auf das bzw. den dieser Pointer zeigen soll. Das muss im Prinzip nicht in A.cpp sein, es bringt aber nur Schwierigkeiten, wenn du es nicht dort machst. Unter Umständen mußt du die Erzeugung am Anfang von main() vornehmen (auf alle Fälle vor Benutzung der Variablen), nämlich dann, wenn die Erzeugung nicht durch eine einfache Zuweisung oder Construktor-Aufruf möglich ist. Dies ist z.B. hier mit der for-Schleife der Fall.
Code:
// A.cpp:
// hier darf eine einfache Zuweisung stehen:
CGitter** Gitter_1 = new CGitter*[index_max+1];

int main(int argc, char** argv)
{
// am besten hier die komplizierten Erzeugungen
// globaler Objekte vornehmen
// Eine for-Schleife darf nur innerhalb einer Klassen-Methode 
// oder Funktion vorkommen
     for(int i=0;i<=9;i++)
     {
           Gitter_1[i] = new CGitter();
     }

...

]

// B.cpp:
extern CGitter** Gitter_1;

void f()
{
    Gitter_1[0]->MatrixErstellen();
}


Gruß
Peter
 
Zuletzt bearbeitet:
ich könnte dich küssen! jawoll!
borr diese zeigerdenken habe ich überhaupt noch nicht drin. das hätte ich wohl nie alleine hinbekommen.

habe jetzt genau das gemacht, was du mir dort oben geschildert hast. es läuft 1a.
VIELEN VIELEN DANK
 
ich könnte dich küssen! jawoll!
borr diese zeigerdenken habe ich überhaupt noch nicht drin. das hätte ich wohl nie alleine hinbekommen.

habe jetzt genau das gemacht, was du mir dort oben geschildert hast. es läuft 1a.
VIELEN VIELEN DANK

bitte sehr, kannst mir ja als kleine Gegenleistung eine gute Bewertung geben :).

Gruß
Peter
 
Zurück