Fehler beim erstellen meiner ersten klasse



  • ä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.



  • asc schrieb:

    Ganz davon abgesehen das ein Programm in der Regel auch beendet werden kann, selbst Services kann man "regulär" beenden).

    Ein Programm mit einer Endlosschleife kann nicht regulär beendet werden. Es kann nur vom Betriebssystem "abgschossen" werden. Dabei hat es keine Chance mehr, einen Rückgabewert aus der main-Funktion ans System zu übergeben.

    Tachyon schrieb:

    Die main-Funktion wird nicht von Dir aufgerufen, sondern quasi vom Betriebssystem. Und das Betriebsystem erwartet, dass die main-Funktion ein bestimmtes Format hat.

    Wenn dem so wäre, warum akzeptiert das Betriebssystem meine "void main()"-Funktion? Offenbar scheint es sich nicht daran zu stören.



  • Wieso lassen wir das nicht Shade of Mine's Post entscheiden ? 😉
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39346.html



  • c++fan 2009 schrieb:

    ...Wenn dem so wäre, warum akzeptiert das Betriebssystem meine "void main()"-Funktion? Offenbar scheint es sich nicht daran zu stören.

    Erstmal weiß das Betriebssystem natürlich nichts vom C++-Sprachstandard .. deswegen wäre es höchstens der Compiler, der etwas dagegen haben könnte (und vermutlich auch hat ... wenn man den Warninglevel vernünftig setzt).
    Zum Anderen wird der Compiler (wenn er es schluckt) es vermutlich in etwas "Betriebssystemkonformes" übersetzen.

    c++fan 2009 schrieb:

    ...
    Ein Programm mit einer Endlosschleife kann nicht regulär beendet werden. Es kann nur vom Betriebssystem "abgschossen" werden. Dabei hat es keine Chance mehr, einen Rückgabewert aus der main-Funktion ans System zu übergeben.

    Offensichtlich hast Du da einen exotischen Fall gefunden, den das Standardisierungskomitee bislang übersehen hat. Du solltest es unbedingt darauf hinweisen, dass ihre Sprachdefinition noch eine Lücke hat!
    Außerdem solltest Du gleich den Typ int_not_3 , die Abzweigungsbedingung if_never_true und den Funktionsklassifizierer never_called einreichen....

    Gruß,

    Simon2.



  • c++fan 2009 schrieb:

    Ein Programm mit einer Endlosschleife kann nicht regulär beendet werden. Es kann nur vom Betriebssystem "abgschossen" werden. Dabei hat es keine Chance mehr, einen Rückgabewert aus der main-Funktion ans System zu übergeben.

    Es ist aber im Allgemeinen nicht entscheidbar, ob ein Programm eine Endlosschleife enthält; somit muss davon ausgegangen werden, dass JEDE main-Funktion regulär beendet werden kann. Deshalb benötigt jede main-Funktion an jedem Verzweigungspfadende eine return-Anweisung, die einen int zurückliefert, weil die Aufrufer - wie schon gesagt - dies erwarten.
    Man kann nicht sagen: "Meine main muss nichts zurückliefern, weil sie ja sowieso nie (regulär) hält", weil du das nicht wissen kannst. Auch der Compiler kann das nicht wissen. Niemand kann das: http://de.wikipedia.org/wiki/Halteproblem
    Triviale Fälle wie

    while(1) { ... }
    

    sind nur Spezialfälle.



  • C++Fan: Die Signatur von main ist nicht verhandelbar. Der C++ Standard legt es so fest. Beweise dem Richter, daß weit und breit kein anderes Auto in Sicht war, als Du bei Rot über die Ampel gefahren bist, es wird Dir nicht helfen. Gesetz ist Gesetz.



  • GyroGearloose schrieb:

    c++fan 2009 schrieb:

    Ein Programm mit einer Endlosschleife kann nicht regulär beendet werden. Es kann nur vom Betriebssystem "abgschossen" werden. Dabei hat es keine Chance mehr, einen Rückgabewert aus der main-Funktion ans System zu übergeben.

    Es ist aber im Allgemeinen nicht entscheidbar, ob ein Programm eine Endlosschleife enthält...
    Triviale Fälle wie

    while(1) { ... }
    

    sind nur Spezialfälle.

    Aber genau hier geht es um diesen Spezialfall.



  • c++fan 2009 schrieb:

    GyroGearloose schrieb:

    c++fan 2009 schrieb:

    Ein Programm mit einer Endlosschleife kann nicht regulär beendet werden. Es kann nur vom Betriebssystem "abgschossen" werden. Dabei hat es keine Chance mehr, einen Rückgabewert aus der main-Funktion ans System zu übergeben.

    Es ist aber im Allgemeinen nicht entscheidbar, ob ein Programm eine Endlosschleife enthält...
    Triviale Fälle wie

    while(1) { ... }
    

    sind nur Spezialfälle.

    Aber genau hier geht es um diesen Spezialfall.

    Und du willst jetzt immer dein Programm von int main() zu void main() ändern, weil du weisst "oh mein Gott, ich werde eine Endlosschleife haben, sofort void hinkritzeln". Ist ja genauso wie, als wenn du mal using namespace std benutzt und mal net, weil du heute einfach mal lustig drauf bist. Also, einfach anpassen und es immer machen.



  • c++fan 2009 schrieb:

    GyroGearloose schrieb:

    c++fan 2009 schrieb:

    Ein Programm mit einer Endlosschleife kann nicht regulär beendet werden. Es kann nur vom Betriebssystem "abgschossen" werden. Dabei hat es keine Chance mehr, einen Rückgabewert aus der main-Funktion ans System zu übergeben.

    Es ist aber im Allgemeinen nicht entscheidbar, ob ein Programm eine Endlosschleife enthält...
    Triviale Fälle wie

    while(1) { ... }
    

    sind nur Spezialfälle.

    Aber genau hier geht es um diesen Spezialfall.

    Die Informatik ist aber (u.a.) die Wissenschaft der automatischen Informationsverarbeitung und nicht die der Alle-möglichen-Spezialfälle-Individuellverarbeitung.
    Denn das ist ja gerade der Witz deines Compilers, dass er unendlich viele (gültige) Quelltexte automatisch übersetzen kann, ohne dass er vorher jeden hartkodiert kennt.


Anmelden zum Antworten