Klassen funktionieren nicht wie sie sollen.

hi leute,
da ich erst seit kurzem mit VC++ arbeite bin ich noch nicht so fit da drin.
code:
Code:
#include "header.h"

class Ctest;

int main (int argc, char* argv[]){
	
            Ctest versuch; <<----------- da hackt es 


fflush (stdin);
getchar();
return 0;
}

// ---------------------------Kassendefinition-----------------------
class Ctest{
private:
	int tObjGroesse ;
	
public:
	int Tgroesse();
    int nenne();

//--------------------------Klassenfunktionen-----------------
int Ctest::nenne(){
cout<<tObjGroesse;
return 0;

};
//---------------------------Konstruktor--------------------------
int Ctest::Tgroesse(){
int TobjGroesse = 1;
return 0;
}

}


das problem: in zeile 7 bricht der compiler ab, begrünundung
1>c:\xxx\visual studio 2008\projects\class\main.cpp(7) : error C2079: 'versuch' verwendet undefiniertes class 'Ctest'

hilfe wäre nett ^^mfg shUnderdog
 
1. Die Definitionen der Methoden sollten außerhalb der Klasse definiert werden, wenn du innerhalb nur die Prototypen angibst. Desweiteren reicht die Vorwärtsdeklaration von Ctest mit "class Ctest;" nicht aus, sondern du musst die ganze Klasse mit Methoden und Membervariablen vorher deklarieren.
Diese Version hier funktioniert:
Code:
..
class Ctest{
	private:
 		int tObjGroesse ;
 	public:
 		int nenne();
		int Tgroesse();
};
//--------------------------Klassenfunktionen-----------------

int main (int argc, char* argv[]){
	            Ctest versuch;
		    fflush (stdin);
		    getchar();
		    return 0;
}

int Ctest::nenne(){
	cout<<tObjGroesse;
 	return 0;
}
//---------------------------Konstruktor--------------------------
int Ctest::Tgroesse(){
	int TobjGroesse = 1;
	return 0;
}

Abgesehen davon ist int Ctest::Tgroesse() kein Konstruktor sondern eine normale Methode. Ein Konstruktor hieße "Ctest(...)"(ohne Typ).
 
Den Typ weglassen kannst du auch nur bei Konstruktoren und diese müssen den selben Namen haben wie die Klasse(mit Groß- und Kleinschreibung).
 
Ehrlich gesagt glaube ich nicht, dass der VC++ keine Konstruktoren kennt. Konstruktoren haben normalerweise auch keinen Rückgabewert. Poste mal bitte deinen Code(Hast du auch gelesen was ich zum Namen des Konstruktors geschrieben habe?)

Dieser Code mit einem Konstruktor kompiliert fehlerfrei beim gcc:
Code:
#include <iostream>

using namespace std;

class Ctest{
        private:
                int tObjGroesse ;
        public:
                int nenne();
                int Tgroesse();
                Ctest(); //selber Name wie die Klasse
};
//--------------------------Klassenfunktionen-----------------

int main (int argc, char* argv[]){
	            Ctest versuch;
		    fflush (stdin);
		    getchar();
		    return 0;
}
//Das ist ein Konstruktor:
Ctest::Ctest()
{
	tObjGroesse=42;
}


int Ctest::nenne(){
	cout<<tObjGroesse;
 	return 0;
}
// KEIN Konstruktor:
int Ctest::Tgroesse(){
	int TobjGroesse = 1;
	return 0;
}
 
ein int als Rückgabewert eines Constructors wäre ziemlich sinnfrei - schließlich gibt der Constructor sozusagen die Instanz der Klasse, also das erzeugte Objekt zurück, wenn man so will...
 
@lesco: das was ihr da habt ist der code ^^
ist ja bisher nur ein test für klassen. also nix weiter als der code.

das es mit anderen compilern (Dev-cpp und code::blocks) geht weiß ich. die frage bleibt aber: warum will vc++ das ein konstruktor einen rückgabewert hat?

das 2. problem (bei meinem ersten code, wenn ich die klassendeklaration vorziehe und int als rückgabewert des konstruktors angebe)
in zeile 7 bricht der compiler ab, begrünundung
1>c:\xxx\visual studio 2008\projects\class\main.cpp(7) : error C2079: 'versuch' verwendet undefiniertes class 'Ctest'
 
Original von shUnderdog
das 2. problem (bei meinem ersten code, wenn ich die klassendeklaration vorziehe und int als rückgabewert des konstruktors angebe)
in zeile 7 bricht der compiler ab, begrünundung
1>c:\xxx\visual studio 2008\projects\class\main.cpp(7) : error C2079: 'versuch' verwendet undefiniertes class 'Ctest'

du deklarierst in Zeile 3 mit "class Ctest;" eine Klasse. D.h. du sagst, dass es eine solche Klasse gibt. Da du sie aber nicht definierst, weiß der Compiler nicht, was die attribute und methoden der Klasse sind, er weiß nur, dass da eine Klasse _ist_.
Von einer undefinierten Klasse lassen sich jedoch keine Instanzen erzeugen (), doch genau das machst du in Zeile 7.

Wenn, dann musst du die _Definition_ der Klasse (von Zeile 16 ab) vorziehen, damit der Compiler, wenn er in main() in Zeile 7 ist, bei der Instanziierung von 'versuch' weiß, wieviel Speicher er reservieren muss (wenn er nur weiß, dass es eine solche Klasse gibt, aber nicht weiß, wieviel Speicher sie braucht, kann er logischerweise keinen Speicher reservieren und ein Objekt erzeugen).

Wenn eine Klasse nur deklariert, aber _nicht_ definiert ist, dann kann man höchstens Pointer zu dieser Klasse erzeugen (Pointer haben immer die gleiche Größe, je nach Prozesorarchitektur unterschiedlich).

Außerdem gehört, wenn mans streng nach C++-Standard nimmt, hinter jede Klassendefinition ein Semikolon ;
Aber VC++ scheint das wohl nicht so zu interessieren :)
 
Original von shUnderdog
@lesco: das was ihr da habt ist der code ^^
ist ja bisher nur ein test für klassen. also nix weiter als der code.

das es mit anderen compilern (Dev-cpp und code::blocks) geht weiß ich. die frage bleibt aber: warum will vc++ das ein konstruktor einen rückgabewert hat?

Ich habe das gerade mal mit VC++ 6.0 in ner VM getestet: Mein Code kompiliert ohne Fehler. Bist du sicher, dass wir vom selben Codestück reden(das was ich gepostet habe,Konstrukturname=Klassenname)?
 
ich hab vc++ express edition 2008, zum test code ich das nochmal nach.
dauert so 20 minuten^^

edit: ich hab das jetz nochmal neu geschrieben, klassendeklaration u. konstruktoren VOR main. seltsamerweise gehts jetz. es kommt kein fehler mehr, der konstruktor muss KEIN rückgabewert mehr haben. seltsam seltsam X(
 
Zurück
Oben