Verweisklassenobjekt in anderer Verweisklasse verwenden

Gast #2971808
Lesenswert?

Hallo,

ich habe zwei Klassen, in denen ich Objekte wie ListBoxen usw. verwenden 
will. Dazu muss ich wohl eine Referenzklasse verwenden.

Bisher ging alles gut und ich verwendete diese Klasse dann in meiner 
"Form1.h".

Jetzt wollte ich zur besseren Codestrukturierung eine zweite Klasse 
erstellen, die dann für alle Forms-Objekte eines bestimmten Tabs 
Referenzobjekte (wenn man das so nennt, also ListBox-Objekte, die dann 
mit dem Konstruktor initialisiert werden und über die ich dann die 
Forms-Objekte ansprechen kann).

Sobald ich aber ein objekt der zweiten Referenzklasse in der 
ursprünglichen als privates Member deklariere, streikt der Compiler als 
würde er meine zweite Referenzklasse nicht kennen. (Ja die ".h" ist 
eingebunden).

Folgende Fehlermeldung erscheint, wenn "TaskDetails^ taskDetails;" int 
"ZentralKlasse" deklariert wird:


error C2143: Syntaxfehler: Es fehlt ';' vor '^'
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: 
"default-int" wird von C++ nicht unterstützt.
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: 
"default-int" wird von C++ nicht unterstützt.

1
ref class TaskDetails
2
{
3
  TextBox^ aufgabenDetailsVorgangsName;
4

5
  Label^ lbAufgabenDetailsNextTasks;
6

7
  ComboBox^ cbAufgabenDetailsStatus;
8
  ComboBox^ cbAufgabenDetailsAufgKateg; 
9

10

11
  TextBox^ tbMarkReason;
12

13
public:
14
  void fktXYZ();
15
};
1
ref class ZentralKlasse
2
{
3
  /* TASKDETAILS */
4
  TaskDetails^ taskDetails;
5

6
  Task* rootTask;
7
  int taskCounter;
8
  int prioCounter;
9

10
  /* AUFGABENBAUM */
11
  ListBox^ lbNowDowName;
12
  ListBox^ lbVorgänge;
13
  ListBox^ lbKommentar;
14
  ListBox^ lbNextTask;
15
  ListBox^ lbPriorität;
16
public:
17
  void fkt();
18
};

Hier zeigt der Compiler keinen Fehler:
1
Form1(void)
2
{
3
  InitializeComponent();
4
  //
5
  //TODO: Konstruktorcode hier hinzufügen.
6
  //
7

8
   taskDetails = gcnew TaskDetails();
9

10
   zentralKlasse = gcnew ZentralKlasse();
11
}

Habt ihr ne Idee was ich falsch mache?
Danke für eure Antworten
#2971985
Lesenswert?

Rainer Hohn schrieb:


> Sobald ich aber ein objekt der zweiten Referenzklasse in der
> ursprünglichen als privates Member deklariere, streikt der Compiler als
> würde er meine zweite Referenzklasse nicht kennen. (Ja die ".h" ist
> eingebunden).

Sehen wollen!
Und zwar beide.
Komplett, nicht nur in Ausschnitten.

Samt der Zeilennummer, die du vom Compiler bei der Fehlermeldung 
kriegst. Und wenn du nett bist, dann markierst du die Zeile im Code.
Gast #2973054
Lesenswert?

Hallo Karl Heinz,
ja ich bin natürlich nett.

Ich hab mal ein einfaches Testprojekt aufgesetzt:

KLASSE1
1
#pragma once
2

3
//#include "Class2.h"
4
ref class Class1
5
{
6
public:
7
  Class1(void);
8
};


//KLASSE 2
1
#pragma once
2

3
#include "Class1.h"
4
ref class Class2
5
{
6
      //HIER TAUCHT DIE FEHLERMELDUNG AUF
7
  Class1^ class1;
8

9
public:
10
  Class2(void);
11
};

Das Problem tritt auf, wenn ich die Header zweier Klassen gegenseitig in 
sich einbinde.
In meinem richtigen (größeren) Projekt ist es so, dass ich in "Klasse2" 
"Klasse1" als Komponete verwende, daher muss ich den Header von Klasse 1 
in Klasse 2 includieren.

Ich hab aber auch noch eine Funktion in Klasse 1, die als Parameter ein 
Objekt von Klasse2 enthält (weil Klasse1 einige seiner Elemente mit 
Werten aus Klasse 2 füllt).

Habt ihr ne Idee wie ich das Lösen könnte? Ich  wollte halt die 
Verwaltung von Objekten auf meiner Forms-Oberfläche so Kapseln, dass es 
nicht eine riesige Klasse gibt.

Danke für eure Antworten,
euer Rainer
Gast #2973060
Lesenswert?

Rainer Hohn schrieb:
> Habt ihr ne Idee wie ich das Lösen könnte?

im Richtigen C++ macht man das mit einer Forward declaration der Klasse.

class Class2;

das ganze vor dem include guard. Wie man das bei C++.net oder in 
kombination mit #pragma once macht weiss ich nicht.

Warum überhaupt C++.net? Macht richtiges C++ oder C# - für beides 
findest du mehr hilfe und unterstützung.
Gast #2973244
Lesenswert?

Weil ich ekurzfristig ein Programm gebraucht habe, das mir bei einigen 
Sachen hilft und das mit einer grafischen Oberfläche.

Deswegen erschien es mir das einfachste, mal schnell eine Windows-Forms 
Anwendung in Visual Studio 2010 zu machen. Ich muss zugeben, dass mir zu 
dem Zeitpunkt nicht klar war, dass dabei ein "anderes C++" also CLI 
verwendet wird.

Aber jetzt alles umschmeißen will ich auch nicht. Wenn es aber 
genausogute Möglichkeiten gibt unter Windows grafische Anwendungen 
leicht zu erstellen (auch unter Visual Studio), dann kannst du mir die 
natürlich auch gerne sagen.

Wie gesagt, ich programmiere eben noch nicht so lange ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren