Probleme mit statischen Klassenelementen



  • Hallo,
    ich habe folgenden Code:

    .h:

    class CanFile
    {
        private:
            static int fh;
        public:
            static int FileOpen(char *filename);        
    
    };
    

    .cpp:

    static int CanFile::FileOpen(char *filename) 
    {   
        if ((fh = open(filename, O_RDONLY)) == -1) {
            printf("canfile: Cannot open file %s.\n", filename);        
            exit(1);
        }   
    
        return (int)fh;
    }
    

    Wenn ich nun die Klasse in mein Hauptprogramm einbinde, mittels

    int fh = CanFile::FileOpen (qApp->argv()[1]);
    

    und alles mit dem gcc kompiliere, kriege ich folgenden Fehler:

    /usr/bin/gcc -Wall -g -I/usr/lib/qt/include -c anFCntl.cpp
    anFCntl.cpp:4: cannot declare member function `static int
    CanFile::FileOpen(char*)' to have static linkage
    make: *** [anFCntl.o] Error 1

    Was geht da schief? Ich habe schon mal die FAQs dazu durchgesehen, aber nach einem Problem mit dem Speicher sieht das nicht aus, da es ja passiert, wenn die Klasse in ein Objekt umgewandelt wird.

    Bin für jede Hilfe dankbar.

    - Bjoern



  • Da ist ein static zuviel

    static //<- wegnehmen
    int CanFile::FileOpen(char *filename) 
    {
    


  • Ja, das hat einen Fehler gelöst, nun kommt aber immer:
    /usr/bin/gcc -Wall -g -I/usr/lib/qt/include -c anFCntl.cpp
    anFCntl.cpp: In static member function static int CanFile::FileOpen(char*)': /usr/bin/gcc -Wall -g -I/usr/lib/qt/include -L/usr/lib/qt/lib -lqt -o qtdbf main.o DlgDbfStat.o xBaseCore.o anFCntl.o DlgDbfStat.moc.o anFCntl.o: In functionCanFile::FileOpen(char*)':
    /home/lunatic/devel/dbf-gui/src/anFCntl.cpp:6: undefined reference to CanFile::fh' /home/lunatic/devel/dbf-gui/src/anFCntl.cpp:6: undefined reference toCanFile::fh'
    /home/lunatic/devel/dbf-gui/src/anFCntl.cpp:11: undefined reference to `CanFile::fh'
    collect2: ld returned 1 exit status
    make: *** [all] Error 1

    Nochh eine Idee?



  • hallo,

    du benutzt in der methode fileOpen eine variable fh, bei der rueckgabe castest du sie nach int, die du nirgendwo anlegst. nur weil die variable im im hauptprogramm auch fh heist weis der compiler noch lang nicht was er in der methode mit dem fh anstellen soll(was sie fuer einen typ hat.



  • Wenn etwas static deklariert ist bedeutet das erstmal, dass beim anlegen eines Objekts dieses etwas nicht mitkopiert wird. Dass heisst aber wiederum, dass der Speicher für dieses etwas nicht automatisch zu irgend einem Zeitpunkt erzeugt, also definiert, wird.
    Ein

    int CanFile::fh
    

    in deiner .cpp sorgt dafür, dass der entsprechnde Speicherplatz reserviert wird.

    Bis dann...
    Peanut

    [ Dieser Beitrag wurde am 23.06.2003 um 10:26 Uhr von Peanut editiert. ]


Anmelden zum Antworten