[VC++] selber Namespace, Klassenzugriff nicht möglich :confused:

the incredible Leitman

Erfahrenes Mitglied
Hallo Leute ^^
Ist vl ne absolut dumme Frage, aber ich komme grad ur nicht weiter -.-

Ich habe in einem namespace 2 Klassen definiert, kann aber nicht von einer Klasse auf die andere zugreifen, da diese scheinbar vorher initialisiert werden muss

Dank der Hilfe eines Freundes bin ich soweit mit meinen Versuchen: (Special thx 2 N!L *gg*)
C#:
using System;
using System.Collections.Generic;
using System.Text;

namespace LeithiKlasse
{
    class foo
    {
        bar b = new bar();
    }
    class bar
    {
        foo a = new foo();
    }
    class Program
    {
        LeithiKlasse.Program prog = new Program ();

        static void Main(string[] args)
        {
            LeithiKlasse.bar b = new bar();
            LeithiKlasse.foo a = new foo();
        }
    }
}
Das funktioniert angeblich ohne Probleme :-O
Wenn ich denselben Code jetzt auf managed C++ umschreibe:
C++:
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;

namespace LeithiKlasse
{
	public ref class foo
	{
		bar ^b; // errors    C2143 / C4430
	};

	public ref class bar
	{
		foo ^a;
	};

	public ref class Program
	{
		static LeithiKlasse::Program ^prog = gcnew Program ();

		static void main()
		{
			LeithiKlasse::bar ^b = gcnew bar();
			LeithiKlasse::foo ^a = gcnew foo();
		}
	};
}
bekomme ich immer die Fehlermeldungen
"error C2143: syntax error : missing ';' before '^'"
und "error C4430: missing type specifier - int assumed. Note: C++ does not support default-int"

Warum das?
Egal, welche Klasse ich zuerst definiere, ich kann nicht auf die nachfolgenden zugreifen
Muss ich eine Art Klassen-Prototypen verwenden?

Oder was mache ich falsch!

Was fehlt mir noch für Verständniss?

Bitte, hoffentlich kann mich jemand aufklären ^^
thx & mfG
Leitman
 
Also...

Das der obige Code nur ein Testbeispiel war, habe ich nun einmal eine ordentliche Trennung zwischen .h und .cpp file gemacht:
C++:
// namespace.h : main project header file.

using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;

namespace LeithiKlasse
{
	public ref class foo
	{	
		public: 
			void init();
	};

	public ref class bar
	{
		public:
			void init();
	};

	public ref class Program
	{
		static int main();
	};
}
C++:
// namespace.cpp : main project file.

#include "stdafx.h"
#include "namespace.h"

using namespace LeithiKlasse;

void foo::init()
{
	bar ^b = gcnew bar();
}

void bar::init()
{
	foo ^a = gcnew foo();
}

int Program::main()
{
	Program ^prog = gcnew Program ();

	bar::init(); // => bar ^b = gcnew bar();

	foo::init(); // => foo ^a = gcnew foo();

	return 0;
}

Nun habe ich aber noch ein paar Fragen... lol
Eigentlich ur easy, aber ich checks scheinbar noch immer nicht so genau -.-

1.)
wie ist das eingentlich mit den precompilierten Headern?
Ich hab die noch nie gebraucht, verwend die auch nie...
und warum muss ich wenn ich sie verwenden will im .cpp file includen?
Es reicht nicht, wenn ich sie im .h file include, und im .cpp file meine Header Datei einbinde, warum?

2).
mir ist gerade aufgefallen, dass die main Methode "static" ist...
und außerdem keinen Rückgabewert hat?

Warum macht man das denn so? bzw. WIE macht man das?

Also normalerweise mache ich Windows Form Anwendungen in C++
und ich habe meistens eine int main () in der ich am Ende 0 zurückgebe...
ich habe das so gelernt, dass man das so macht, aber gibts dafür auch nen Grund?
Und warum ist die main static :confused:

3).
Da komm ich überhaupt gleich zu dem Thema "static":
Kann mir irgendwer einfach den Sinn von Static Methoden erklären? BITTE
Bei Variablen, versteh ichs ja, aber Methoden, die static sind,
damit hab ich immer nur Probleme...
z.B.: error C2352 illegal call of nonstatic member function
Die MSDN hab ich in dem Punkt nicht verstanden, kann mir das jemand einfacher erklären

Nagut Leute, ich weiß, dass war viel Dummes auf einmal,
aber ich checks im Moment gar nicht,

wär schön wenn mir das jemand nächer erläutern könnte
thx und mfG
Leitman
 
Zuletzt bearbeitet:
bezüglich error C2143:

hm...scheinbar hat das rein gar nichts mit dem Schlüsselwort "static" zutun... oder ich checks einfach nicht :( -.-

Aber ich muss eine Variable der Klasse definieren, mit DIESER kann ich die Funktion dann ohne Problemaufrufen...WTF :confused: o_O

Wieso dass den...
Ich will eine einfache public Funktion aufrufen, wieso kann ich das nicht aus einer anderen Klasse tun, wenn ich nicht eine Member der Klasse in der sich die gewünschte Funktion befindet erzeuge? Das versteh ich nicht :(

Ich kann doch auch einfach System::Windows::Forms::MessageBox::Show("Message");
aufrufen, ohne dass ich ein MessageBox Object oder was auch immer instanzieren muss :condfused:

kann mir das BITTE jemand erklären
Was mache ich falsch? Woran liegt das?

Die MSDN hat mir hierbei nicht wirklich weitergeholfen, wonach könnte ich noch suchen / fragen?

mfG
Leitman
 
Das der obige Code nur ein Testbeispiel war, habe ich nun einmal eine ordentliche Trennung zwischen .h und .cpp file gemacht
Ich schätze mal, dass dein Compiler nicht wusste, was weiter unten definiert wird, weil Du eben kein Header-File definiert hast, so wie man das auch eigentlich immer macht. Zumindest habe ich es bisher anders nicht gesehen.

1.)
wie ist das eingentlich mit den precompilierten Headern?
Ich hab die noch nie gebraucht, verwend die auch nie...
und warum muss ich wenn ich sie verwenden will im .cpp file includen?
Es reicht nicht, wenn ich sie im .h file include, und im .cpp file meine Header Datei einbinde, warum?
Ich bin zwar kein cpp Crack, aber ich schätze mal, dass sie für einer saubere Trennung zwischen Deklarationen, Methodensignaturen und eigentlichem Quellcode darstellen und als Schnittstellen zwischen den einzelnen Bestandteilen des Programms fungieren. Damit wird zudem ein riesen Programmaufbau überschaubarer.
Ich würde sagen, dass Du dir die Basics deiner Programmiersprache mal in einem gescheiten Buch anschauen solltest. Solche Dinge zu spät zu hinterfragen, kann die Entwicklung bisheriger Projekte negativ beeinflusst haben. ;)

2).
mir ist gerade aufgefallen, dass die main Methode "static" ist...
und außerdem keinen Rückgabewert hat?

Warum macht man das denn so? bzw. WIE macht man das?

Also normalerweise mache ich Windows Form Anwendungen in C++
und ich habe meistens eine int main () in der ich am Ende 0 zurückgebe...
ich habe das so gelernt, dass man das so macht, aber gibts dafür auch nen Grund?
Und warum ist die main static :confused:
Junge Junge, das ist jetzt nicht dein Ernst Leitman. :eek:
Die Methode muss static sein, damit sie das System als Programm-Einsprungpunkt erkennen kann. Wenn sie nicht statisch währe, müsste erst eine Instanz der Klasse die sie definiert erzeugt werden. Was würde das überhaupt für einen Sinn machen? ;)
Der Rückgabewert der Mainmethode repräsentiert den ExitCode mit dem sich ein Programm im System verabschiedet (Process.ExitCode).

3).
Da komm ich überhaupt gleich zu dem Thema "static":
Kann mir irgendwer einfach den Sinn von Static Methoden erklären? BITTE
Bei Variablen, versteh ichs ja, aber Methoden, die static sind,
damit hab ich immer nur Probleme...
Das merke ich. Statisch bedeutet. dass Du keine Instanz des Objektes erzeugen musst, welches die Methode definiert, um sie verwenden zu können. Kannst die Methode dann direkt über den KlassenNamen aufrufen. Mit anderen Worten, solange innerhalb der Methode nicht mit Membern des Objektes, welches die Methode definiert, gearbeitet werden muss, die Methode quasi lediglich eine simple Aufgabe übernimmt, wird sie als static definiert. Warum erst ein Objekt instanzieren, wenn die Methode keine Member des Objektes erfordert? Geht Dir langsam ein Lichtlein auf Leitman? :D

z.B.: error C2352 illegal call of nonstatic member function
Die MSDN hab ich in dem Punkt nicht verstanden, kann mir das jemand einfacher erklären
Du hast versucht über den KlassenNamen eine Methode aufzurufen, die nicht als statisch definiert wurde, ergo nicht über den KlassenNamen, sondern nur aufrufbar ist, wenn Du eine Instanz der Klasse erstellt hast.
C#:
class SomeClass
{
    public static void StaticMethod()
    {
        Console.WriteLine( "Static Method called" );
    }

    public void InstanceMethod()
    {
        Console.WriteLine( "Instance Method called" );
    }
}

class Program
{
    public static void Main( string[] args )
    {

        SomeClass.StaticMethod(); // statischer Methodenaufruf, keine Instanzierung des Objekts notwendig

        SomeClass.InstanceMethod() // Fehler! Methode nicht als statisch definiert

        SomeClass someClass = new SomeClass();
        someClass.InstanceMethod(); // Instanzaufruf der Methode
    }
}
 
OH MEIN HELD :D
Ich schätze mal, dass dein Compiler nicht wusste, was weiter unten definiert wird, weil Du eben kein Header-File definiert hast, so wie man das auch eigentlich immer macht. Zumindest habe ich es bisher anders nicht gesehen.
Ja, das dachte ich mir auch schon, war nur etwas verwirrt, weil ich auf schnell ein Testprojekt erstellt habe, in dem sich alles im .h File befindet... So hats natürlich nicht funktioniert, bin dann eh selber drauf gekommen,
nur war ich am Anfang etwas hilflos -.-

Ich bin zwar kein cpp Crack, aber ich schätze mal, dass sie für einer saubere Trennung zwischen Deklarationen, Methodensignaturen und eigentlichem Quellcode darstellen und als Schnittstellen zwischen den einzelnen Bestandteilen des Programms fungieren. Damit wird zudem ein riesen Programmaufbau überschaubarer.
Eben deshalb ja... ich habe bisher noch keine vorkompilierten Header files verwendet,
nur ist es mir eben bei diesem Testbeispiel wieder untergekommen und ich habe mir gedacht, "was macht eine include-Datei im .cpp File"
Da ich versuche genau diese Trennung von Deklaration und vollständig implementierten Quellcode zu halten war ich auch ziemlich :confused:
Dachte mir bisher ich kann im .cpp File einfach den dazugehörigen Header einbinden, da in dem alles was ich brauche definiert und inkludiert wird... scheinbar nicht -.-

Ich würde sagen, dass Du dir die Basics deiner Programmiersprache mal in einem gescheiten Buch anschauen solltest. Solche Dinge zu spät zu hinterfragen, kann die Entwicklung bisheriger Projekte negativ beeinflusst haben. ;)
Ja, was heißt :(
Gebe dir vollkommen Recht...
Selbst wenn ich diese Basics noch nicht gebraucht habe, sollte ich dennoch wissen, was das eigentlich ist *schämemich*
Werd mich aber informierten, was es da so an gutem Lesestoff parat gibt ^^
Danke mal (!)

Die Methode muss static sein, damit sie das System als Programm-Einsprungpunkt erkennen kann. Wenn sie nicht statisch währe, müsste erst eine Instanz der Klasse die sie definiert erzeugt werden.
...
Statisch bedeutet. dass Du keine Instanz des Objektes erzeugen musst, welches die Methode definiert, um sie verwenden zu können. Kannst die Methode dann direkt über den KlassenNamen aufrufen. Mit anderen Worten, solange innerhalb der Methode nicht mit Membern des Objektes,
...
Geht Dir langsam ein Lichtlein auf Leitman? :D
Ahhhh jetzt ja....

So schließt sich der Kreis und alles ergibt einen Sinn! :-O

Wo sich so eine Basic Wissenslücke überall auswirken kann... wie bereits erwähnt,
ich kenne das Schlüsselwort static nur von Variabledeklarationen :(

Aber dank dir, mein Jedi Meister *verbeuge mich*
Wieder mal hast du mich von meiner Unwissenheit befreit
big thx
:) :) :)
 

Neue Beiträge

Zurück