Static Memberfunktionen



  • Ich hab es gerade einmal mit initialisierung der Variablen versucht, aber die Fehlermeldung ist die gleiche. 😞



  • Ich kann Deine Fehlermeldung hier nicht nachvollziehen:

    haeader:

    class hauptklasse
    {
    
    public:   
    
        static int    iNo;
        static std::string   szText;
    
        static void SetNo (int iNoToset);
    
        static void PaintMenue();
    
    };
    

    Body:

    #include <stdio.h>
    #include <string>
    #include <iostream>
    #include "hauptklasse.h"
    
    int hauptklasse::iNo = 1;
    std::string hauptklasse::szText = "ABCDE\n";
    
    void hauptklasse::SetNo (int iNoToset)
    {
        iNo = iNoToset;
    }
    
    void hauptklasse::PaintMenue (void)
    {
        printf ("Test\n");
    }
    

    Main:

    #include <stdio.h>
    #include <string>
    #include <iostream>
    #include "hauptklasse.h"
    
    int main (int  argc, char **argv)
    {
        hauptklasse::SetNo (4711);    
    
        printf ("%d\n", hauptklasse::iNo);
    
        std::cout << hauptklasse::szText;
    
        hauptklasse::PaintMenue ();
    }
    

    compiliert ohne Warnung und erzeugt:

    4711
    ABCDE
    Test

    Als Output



  • Was passiert denn, wenn du es jetzt z.B. so machst:

    Body:

    #include <stdio.h>
    #include <string>
    #include <iostream>
    #include "hauptklasse.h"
    
    int hauptklasse::iNo = 1;
    std::string hauptklasse::szText = "ABCDE\n";
    
    void hauptklasse::SetNo (int iNoToset)
    {
        iNo = iNoToset;
    }
    
    void hauptklasse::PaintMenue (void)
    {
        printf ("Test\n");
        SetNo(2);          //Gibt es hier ein unresolved Symbol?
    }
    

    main:

    #include <stdio.h>
    #include <string>
    #include <iostream>
    #include "hauptklasse.h"
    
    int main (int  argc, char **argv)
    {
        hauptklasse::PaintMenue ();
        printf ("%d\n", hauptklasse::iNo);    
        return 0;
    }
    


  • Nee.



  • Ähh... Ne? Wie jetzt?



  • PeterP schrieb:

    Ähh... Ne? Wie jetzt?

    Kein unresolved symbol. Warum auch ?
    Kurt



  • Offengestanden, ich habe eher den Verdacht, dass der Linker nichts von hauptmenue-Objectdatei weiss. Ich weiss nicht welchen Compiler und Linker Du benutzt, aber schau mal in diese Richtung.



  • Mhhh ist schon merkwürdig. Ich verwende Microsoft Visual C++ 6.0.
    Ich hab absolut keine Ahnung wo ich noch nach dem Fehler suchen soll. Die Sources, so wie ihr sie hier gepostet habt, laufen ja auch (btw, vielen Dank für die Mühe).

    Nur bei mir im Programm muss etwas anders laufen, als dort. Nur was? Das ist ein großes Projekt, d.h. auch ziemlich schwer den Fehler zu finden



  • Wennd as Projekt wirklich groß ist, solltest du daran denken, Unittests durchzuführen. Sprich: schreib für jede komplexere Klasse und für jede kleinere Gruppe zusammengehörender Klassen Kleine Programme, die nichts anderes tun als die KLassen auf ihre Funktionalität zu überprüfen.
    Sprich:
    - für jede Methode, die eine Klasse anbietet, solltest du eine Handvoll repräsentativer Aufrufe machen und die Ergebnisse überprüfen.
    - Mache außerdem Aufrufe für den Grenzbereich der akzeptierten Werte, zum Beispiel bei Numerischen Argumenten den größtmöglichen Wert usw.
    - gehe nicht von Annahmen aus, was das Verhalten einzelner Codestücke angeht, sondern beweise für dich selbst schriftlich, dass dein Code sich so verhält, wie erwartet. Das bedeutet nicht, dass du deine function(int) einmal mit 5 aufrufst udn bemerkst, dass dass richtige Ergebnis rauskommt, sondern dass du für jeden Annehmbaren Wert zeigstm dass die Funktion das richitge Ergebnis liefert. Das bedeutet, auf dinge wie (beispielsweise) mögliche Division durch 0 im Code zu achten etc.
    - schreibe an deine Methoden im Quellcode Kommentare, für welchen Wertebereich sie richtige Ergebnisse liefern soll, und überprüfe, ob du sie auch nur in dem Wertebereich benutzt. Beispielsweise muss für die Funktion "div(float x, float y)" vor Aufruf feststehen, dass y nicht 0 ist. Das ist nicht Aufgabe der Funktion, das zu prüfen, sondern des Aufrufers. Sowas kann man beispielsweise so formulieren:

    float div(float x, float y)
    /** Contidions:
      * @pre: y != 0
      * @post: div(x,y) * y - x <= std::numeric_limits<float>::epsilon
      */
      {
      //...
      }
    

    Ansonsten: prüfe deinen Code sorgfältig auf Dinge wie default Ctor und Copy-Ctor, default operator=, default Dtor, new&delete bzw. new[]&delete[], diverse Arten von Memoryleaks (z.B. virtuelle Dtors bei Basisklassen) etc.

    Und schleßlich und endlich: Kommentiere deinen Quellcode ausführlich, alles was du zusichern kannst und nicht zusichern kannst, alles was getestet und nicht getestet wurde etc.



  • Ok, vielen Dank für die Tipps, ich werd das mal überarbeiten, vielleicht wirds dann ja was. 😉


Anmelden zum Antworten