Forum: PC-Programmierung Verweisklassenobjekt in anderer Verweisklasse verwenden


von Rainer Hohn (Gast)


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

von troll (Gast)


Lesenswert?

Es fehlt ein Hinweis auf die Programmiersprache... C#?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die Fehlermeldungen deuten darauf hin, dass da einem C++-Compiler ein 
Nicht-C++-Programm vorgesetzt wurde.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rainer Hohn schrieb:
> TextBox^ aufgabenDetailsVorgangsName;

Das ist kein C++, das ist "Managed C++" bzw. "C++/CLI" - .Net-Geraffel, 
das mit C++ nur den Namen gemein hat.

von Karl H. (kbuchegg)


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.

von Rainer Hohn (Gast)


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

von Peter II (Gast)


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.

von Rainer Hohn (Gast)


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 ;)

von peter II (Gast)


Lesenswert?

Steht doch schon da, c#. Die gui geht dort genauso, nur die sprache ist 
etwas anders.

Einfach neues Projekt und c# auswählen, eventuell kan man dein projekt 
konvertieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.