Fehler: Fehlendes ';' vor Bezeichner



  • Hallo,

    bei meinem Testprojekt bekomme ich immer mehrere Fehlermeldungen:

    Syntaxfehler : Fehlendes ';' vor Bezeichner 'libObj'
    'CLibrary' : Fehlende Speicherklasse oder Typbezeichner
    'libObj' : Fehlende Speicherklasse oder Typbezeichner
    ProjectBase.cpp
    'CProjectBase' : Basisklasse undefiniert
    'libObj' : nichtdeklarierter Bezeichner
    Der linke Teil von '.AddToLib' muss eine Klasse/Struktur/Union sein

    hier ist die Header meiner Basisklasse:

    #include "Library.h"	// Hinzugefügt von der Klassenansicht
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    class CProjectBase  
    {
    public:
    	CLibrary libObj;
    
    	CProjectBase();
    	virtual ~CProjectBase();
    };
    

    ProjectBase.cpp

    int main()
    {
    	libObj.AddToLib();
    	return 0;
    
    }
    

    Library.h

    #include "ProjectBase.h"
    
    class CLibrary : public CProjectBase  
    {
    public:
    
    	CLibrary();
    	virtual ~CLibrary();
    	void AddToLib();
    };
    

    Library.cpp

    #include <iostream.h>
    #include "Library.h"
    #include "ProjectBase.h"
    
    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    
    CLibrary::CLibrary()
    {
    
    }
    
    CLibrary::~CLibrary()
    {
    
    }
    
    void CLibrary::AddToLib()
    {
    	cout << "funktioniert!";
    }
    


  • #include "Library.h"
    #include "ProjectBase.h" 
    
    int main()
    {
        CProjectBase projBase;
        projBase.libObj.AddToLib();
        return 0;
    }
    


  • leider erhalte ich weiterhin 4 Fehlermeldungen

    Fehlendes ';' vor Bezeichner 'libObj'
    'CLibrary' : Fehlende Speicherklasse oder Typbezeichner
    'libObj' : Fehlende Speicherklasse oder Typbezeichner
    ProjectBase.cpp
    'CProjectBase' : Basisklasse undefiniert

    funktioniert der Code bei Dir?



  • jetzt hab ich mirs kurz genauer angeschaut

    versuchst du ne endlosschleife zu machen?
    warum sollte das funktionieren

    class CLibrary : public CProjectBase

    class CProjectBase
    {
    public:
    CLibrary libObj;

    jedes projectbase hat ne library die ne library hat die ne library hat die ne library hat...



  • bestimmt denkt ihr, ich erwarte von euch, dass ihr für mich das fehlende Semikolon sucht. Nee, das sollt ihr ja gar nicht. 😉 Da fehlt keins.

    Mit diesem Problem habe ich schon sehr lange zu kämpfen, nur weiss ich nichgt mehr weiter. Ich habe schon viel nachgeschlagen und herumprobiert.
    Der Debugger verweist immer auf "CLibrary libObj;".
    Stimmen die Includes nicht?



  • wie gesagt das problem is, dass CLibrary CProjectBase einbinden muss und CProjectBase CLibrary einbinden muss

    steckt da auch ein sinn dahinter?



  • Das ist nur ein Testprojekt zur Verdeutlichung des Problems. Bei meiner eigendlichen Anwendung will ich aber dasselbe tun.
    Allgemein gesagt: Ich will einfach von einer Methode meiner Basisklasse, auf eine Methode der Abgeleiteten zugreifen. Dazu brauche ich doch eine Instanz von CLibrary, oder nicht?
    Wenn ich das Objekt innerhalb meiner Basisklasse-Methode erstelle, funktioniert das auch.
    Problem nur: Wenn ich das Objekt innerhalb der Klassendeklaration erstelle, geit dat nich! 😞



  • CodeVerhunzer schrieb:

    Ich will einfach von einer Methode meiner Basisklasse, auf eine Methode der Abgeleiteten zugreifen.

    Schon mal was von virtual gehört?
    Übrigens, dein Nick passt irgendwie. 😃



  • Guten Morgen,

    virtual hab ich natürlich auch schon eingesetzt, hier aber weggelassen.
    Das Problem ist ja nicht der Aufruf der Methode an sich, sondern die Erstellung der CLibrary-Instanz in CProjectBase.h

    PS: meinen Nickname trage ich mit Stolz! Postet mir euren Code! Ich zerstör ihn euch !! 😃 😃



  • hallo

    in der basisklasse brauchst du kein include
    #include "Library.h" // Hinzugefügt von der Klassenansicht

    sondern eine vowärtsdeklaration!

    class CLibrary;
    
    class CProjectBase  
    {
    public:
        CLibrary libObj;
    
        CProjectBase();
        virtual ~CProjectBase();
    };
    

    zum anderen, verwende bitte den neuen iostream header aus dem namespace std.

    #include <iostream> 
    using namespace std;
    

    zum dritten, verwende nicht so oft den klassenassistenten, .. oder verwende ihn richtig. zum bleistift hast du einmal einen includewächter, einmal nicht.

    mach einfach die includewächter erstmal selber.

    so long

    ps: die C's vor den klassen sind ein wenig extrem visual studio.. geschmackssache 😉



  • Danke für die Tips!
    Ich habe jetzt CLibrary "vorwärtsdeklariert". Nur kommt jetzt der Fehler, dass die von libObj benutzte Klasse CLibrary undefiniert sei, was doch eigendlich nicht der Fall ist. Was hab ich nu verbockt?



  • tja, ab diesem punkt mache dir nochmal gedanken über dein design.

    zum einen: arbeite mit zeigern, nicht mit instanzen, zum anderen: überlege dir nochmal, was du eigentlich machen möchtest.

    ist mir nicht ersichtlich.



  • vorwärtsdeklarationen klappen doch nur bei pointern und referenzen oder?



  • ich will lediglich von einer CLibrary-Instanz aus eine CLibrary-Methode aufrufen. Die Instanz soll aber in der Basisklasse deklariert sein. Der Aufruf soll in main erfolgen.

    So geht's natürlich auch:

    int main()
    {
    
    CProjectBase* pLib = new CLibrary;
    
    pLib->AddToLib();
    
    	return 0;
    }
    

    aber es muss doch auch wie oben genannt funzen? Eben über ein Objekt, dekl. in der Basisklasse. Besser wäre natürlich über einen Zeiger. Ich weiss nur nicht wie!



  • nö würde mich wundern wenn das mit nem objekt geht

    schliesslich müsstest du unendlich viel spiecher allokieren um eine einzige instanz zu erstellen



  • gut, dann ist der Weg mit "new" der beste und einzige?



  • ne der beste weg is es garnich zu machen weil es unsinn zu sein scheint dass jede
    CLibrary eine CLibrary beinhaltet

    wie elise gesagt hat mach dir mal gedanken über das design



  • hallo

    der zeiger muss in die klasse... bzw. du machst keine instanz, sondern einen zeiger.

    na ja, versuche erstmal, klarer zu machen, was du möchtest, warum du möchtest, klarer: was dein programm können soll, welche objekte dein programm braucht, wie sie untereinander kommunizieren, was für klassen dementsprechend benötigt werden, wie sie zusammenhängen... etc..

    so kommst du nicht weiter.



  • Ok, ich versuchs mal. Das Programm um welches es bisher ging ist eigendlich nur nur ein Pseudoprogramm um mein Problem auf der Konsole zu verdeutlichen. Das Prog woran ich arbeite ist eine MFC MDI-Anwendung (dessen Beschreibung eigendlich nicht hier hin gehört, ich weiss). Ich erkläre trotzdem mal weiter.

    Mein allgemeines Problem ist, dass meine Ansichtsklasse CMyView (abgel. von Basisklasse CView), einfach zu viele Funktionen hat und ich beim Öffnen der Klasse im Projektexplorer von den Funkts erschlagen werde. Durchblick unmöglich.
    Zugriffsmethoden, OnLButtonClick, GetDocument...kotz, kotz, kotz!

    Bevor ich hier die Krise kriege, hatte ich vor, die Funktionen auszulagern in andere Klassen.
    In meinem Fall:
    1. von CMyView eine Klasse CLibrary ableiten, die weitere Zeichenfunktionen enthält.
    2. Dann von OnLButtonDown (befindet sich in CMyView) eine Funktion von CLibrary aufrufen, z.B. OnDraw(CDC* pDC)

    Ich habe mal einige Funktionen in eine dll augelagert, aber es geht doch auch anders, oder?


Anmelden zum Antworten