Fehler beim erstellen meiner ersten klasse



  • Hi ich wollte gerade eine Klasse Konto erstellen.
    Aber immer wenn ich mein Programm starte kommt eine Fehlermeldung:

    ------ Erstellen gestartet: Projekt: Projekt_1, Konfiguration: Debug Win32 ------
    Kompilieren...
    Main().cpp
    Verknüpfen...
    MSVCRTD.lib(crtexe.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".
    C:\Dokumente und Einstellungen\wurstuk\Eigene Dateien\Visual Studio 2008\Projects\Übungen\Debug\Projekt_1.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\wurstuk\Eigene Dateien\Visual Studio 2008\Projects\Übungen\Übungen\Debug\BuildLog.htm" gespeichert.
    Projekt_1 - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Daraus werd ich aber irgendwie nicht schlau... ist nämlich meine erste Klasse^^

    Hier ist der Code:

    Konto.h

    #ifndef _Konto_h_
    #define _Konto_h_
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Konto
    {
    private:
    	string name;
    	int konto_nr;
    	double betrag;
    
    public:
    	bool insert(string name, int konto_nr, double betrag);
    	void display();
    };
    #endif
    

    Quellcode:

    #include "konto.h"
    #include <iostream>
    
    using namespace std;
    
    #define cls system("cls");
    
    bool Konto::insert(string name2, int konto_nr2, double betrag2)
    {
    	if (name2.size() < 1)
    	{
    		return false;
    	}
    	name = name2;
    	konto_nr = konto_nr2;
    	betrag = betrag2;
    	return true;
    }
    
    void Konto::display()
    {
    	cls;
    	cout << "\n Kontoinhabe: " << name
    		 << "\n Kontonummer: " << konto_nr
    		 << "\n Kontostand:  " << betrag
    		 << "\n";
    }
    

    Ich hoffe ihr könnt mir sagen was ich falsch mache.

    fg Wurst



  • du hast keine main.
    irgendwie erinnert mich das an einen fernlehrgang.



  • ok hab ne main dazu gemacht aber jetzt gibt es ne andere Fehlermeldung:

    error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.



  • zeig mal deine main...

    ich tippe ja mal darauf, dass du es so gemacht hast:

    main()
    {
    /*...*/
    

    richtig wäre es so:

    int main()
    {
    /*...*/
    }
    

    bb



  • meine Main:

    #include "konto.h"
    #include <iostream>
    
    using namespace std;
    
    #define cls system("cls");
    
    bool Konto::insert(string name2, int konto_nr2, double betrag2)
    {
    	if (name2.size() < 1)
    	{
    		return false;
    	}
    	name = name2;
    	konto_nr = konto_nr2;
    	betrag = betrag2;
    	return true;
    }
    
    void Konto::display()
    {
    	cls;
    	cout << "\n Kontoinhabe: " << name
    		 << "\n Kontonummer: " << konto_nr
    		 << "\n Kontostand:  " << betrag
    		 << "\n";
    }
    
    main()
    {
    
    }
    

    fg WUrst



  • void main()
    {
    
    }
    


  • c++fan 2009 schrieb:

    void main()
    {
    
    }
    

    NEIN. void main gibt es nicht, und gab es noch nie. Das Compiler dies teilweise zulassen ist wider dem C++ Standard. Es heißt "int main()".



  • ganz ehrlich ich bin so blöd...^^ hab ich total vergessen thx

    fg Wurst

    P.S. @asc wurde mir in einem tutorial auch gesagt aber in einem anderen wurde es dann wieder mit void gemacht naja egal^^



  • asc schrieb:

    NEIN. void main gibt es nicht, und gab es noch nie. Das Compiler dies teilweise zulassen ist wider dem C++ Standard. Es heißt "int main()".

    Auch hier?

    int main ()
    {
      while (1)
      {
         // Endlosschleife
      }
      return 587587;  // Was soll ich zurückgeben? Das Programm kommt niemals hier an.
    }
    

    😕



  • c++fan 2009 schrieb:

    Auch hier?

    Ja, auch dort. Es gibt genau zwei zulässige Formen der main-Funktion im C++ Standard, und beide besitzen den Rückgabewert int. Nur musst du in der main-Funktion auch kein return schreiben (ohne return wird beim beenden explizites 0 zurückgegeben).



  • asc schrieb:

    Ja, auch dort. Es gibt genau zwei zulässige Formen der main-Funktion im C++ Standard, und beide besitzen den Rückgabewert int. Nur musst du in der main-Funktion auch kein return schreiben (ohne return wird beim beenden explizites 0 zurückgegeben).

    Aber mein Programm beendet sich nicht. Dann wird auch nichts zurückgegeben.



  • c++fan 2009 schrieb:

    Aber mein Programm beendet sich nicht. Dann wird auch nichts zurückgegeben.

    Und deshalb willst du Code schreiben der von einigen Compilern berechtigterweise als Warnung oder Fehler gehandhabt wird? Was für eine Begründung.

    Bei mir läuft der Code jedenfalls nicht (Da ich Warnungen auch als Fehler handhabe, da jede Warnung ein Problem darstellen kann):

    1>.\main.cpp(2) : error C2220: Warnung wird als Fehler interpretiert, es wurde keine object-Datei generiert.
    1>.\main.cpp(2) : warning C4326: Der Rückgabetyp von "main" sollte "int" und nicht "void" sein
    


  • ähhh ich hätte jetzt nochmal ne frage zu klassen^^

    Ich habe folgenden Code geschrieben:

    #include "konto.h"
    #include <iostream>
    
    using namespace std;
    
    #define cls system("cls");
    
    bool Konto::insert(string name2, int konto_nr2, double betrag2)
    {
    	if (name2.size() < 1)
    	{
    		return false;
    	}
    	name = name2;
    	konto_nr = konto_nr2;
    	betrag = betrag2;
    	return true;
    }
    
    void Konto::display()
    {
    	cls;
    	cout << "\n Kontoinhabe: " << name
    		 << "\n Kontonummer: " << konto_nr
    		 << "\n Kontostand:  " << betrag
    		 << "\n";
    }
    
    int main()
    {
    	string name;
    	int nr;
    	double stand;
    	cin >> name >> nr >> stand;
    	Konto::insert(name, nr, stand);
    	Konto::display();
    }
    

    jetzt kommt aber immer diese Fehlermeldung:

    c:\dokumente und einstellungen\wurstuk\eigene dateien\visual studio 2008\projects\übungen\übungen\main().cpp(35) : error C2352: 'Konto::insert': Unzulässiger Aufruf einer nicht statischen Memberfunktion
    c:\dokumente und einstellungen\wurstuk\eigene dateien\visual studio 2008\projects\übungen\übungen\konto.h(16): Siehe Deklaration von 'Konto::insert'
    c:\dokumente und einstellungen\wurstuk\eigene dateien\visual studio 2008\projects\übungen\übungen\main().cpp(36) : error C2352: 'Konto::display': Unzulässiger Aufruf einer nicht statischen Memberfunktion
    c:\dokumente und einstellungen\wurstuk\eigene dateien\visual studio 2008\projects\übungen\übungen\konto.h(17): Siehe Deklaration von 'Konto::display'
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\wurstuk\Eigene Dateien\Visual Studio 2008\Projects\Übungen\Übungen\Debug\BuildLog.htm" gespeichert.
    Projekt_1 - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    was mach ich jetzt schon wider falsch? 😉

    fg Wurst


  • Administrator

    wurstuk schrieb:

    was mach ich jetzt schon wider falsch? 😉

    Vielleicht zuerst ein Objekt der Klasse erstellen und dann die Methoden auf dem Objekt aufrufen?
    Vielleicht liegt aber auch der Fehler daran, dass du kein C++ Buch liest, es nicht richtig liest oder einfach wild drauf los gehst 🙂

    Grüssli



  • wurstuk schrieb:

    was mach ich jetzt schon wider falsch? 😉

    wie lernst du C++?

    normalerweise hast du 3 dateien - 2 cpp`s und eine h:

    /*konto.cpp*/
    #include "konto.h"
    
    //implementationen der member-fkt:
    
    bool Konto::insert (string name2, int konto_nr2, double betrag2)
    {
    return true;
    }
    
    //usw
    
    /*konto.h*/
    
    class Konto
    {
    private:
    /**/
    public:
    /**/
    };
    
    /*main.cpp*/
    #include "konto.h"
    
    int main()
    {
     Konto konto; //hier erzeugst du das objekt
     konto.insert (...); //und hier rufst du die member-fkt auf
     /*
     Konto::insert(...) würde eben keine normale member-fkt aufrufen können, weil nicht gesagt wird, welches objekt, zu der diese gehört... so ruft man also nur statische methoden auf
     */
    }
    

    btw: meinen letzten post hast du nich ma durchgelesen, oder?
    ich hab noch hingeschrieben, dass es int main() {/*..*/} heißt - aber du hast es einfach nur ohne mal über deine fehlermeldung nachzudenken, hinkopiert - und vor allem eben, ohne mal zu lesen, was ich geschrieben habe...

    bb



  • das wild drauf losgehen trifft es ganz gut^^
    wollte die Bsp aus dem Buch einfach mal ausprobieren damit ich es besser verstehe aber werd dann erstmal das kapitel ganz durchlesen :p

    fg Wurst

    P.S. doch hab ich unskilled aber wohl nicht gründlich genug... sry ich dachte der Schwerpunkt von deinem Post lag hier drauf:

    main()
    {
    //...
    //hier war keine {
    

    ich weiß isn bisschen dumm^^

    fg Wurst



  • Ausprobieren kann ja ab und zu ganz interessant sein, aber ohne Theorie kommt man normalerweise nicht weit. Also nimm dir die Zeit. 😉

    c++fan 2009 schrieb:

    Aber mein Programm beendet sich nicht. Dann wird auch nichts zurückgegeben.

    Das ist ja lustig. Bei Funktionen mit folgender Anweisung muss der Rückgabetyp deiner Argumentation nach wohl zur Laufzeit bestimmt werden. :p

    int i = rand() % 2;
    while (i);
    


  • Nexus schrieb:

    c++fan 2009 schrieb:

    Aber mein Programm beendet sich nicht. Dann wird auch nichts zurückgegeben.

    Das ist ja lustig. Bei Funktionen mit folgender Anweisung muss der Rückgabetyp deiner Argumentation nach wohl zur Laufzeit bestimmt werden. :p

    int i = rand() % 2;
    while (i);
    

    Nein. Deine Funktion kann zurückkehren. In dem Fall würde ein Rückgabewert fällig sein.
    Eine main()-Funktion, die niemals zurückkehrt, ist was anderes.
    Wieso sollte man "int main()" schreiben, obwohl ein Rückgabewert nie gebraucht, geschweige denn überhaupt erzeugt wird. 😕
    Hier wäre "void main()" richtig.



  • c++fan 2009 schrieb:

    Hier wäre "void main()" richtig.

    Und weiterhin: Nein, und darüber müssen wir auch nicht diskutieren - es ist einfach schon nach dem Standard so.

    Du magst niemals zu einen return kommen, dennoch ist "void main" schlicht und ergreifend ungültiges C++ (Ganz davon abgesehen das ein Programm in der Regel auch beendet werden kann, selbst Services kann man "regulär" beenden).



  • c++fan 2009 schrieb:

    ...rhabarber...

    Die main-Funktion wird nicht von Dir aufgerufen, sondern quasi vom Betriebssystem. Und das Betriebsystem erwartet, dass die main-Funktion ein bestimmtes Format hat. Und void main() oder gar main() zählt nicht zu den erwarteten Formaten.


Anmelden zum Antworten