objekt als membervariable



  • hallo,
    vielleicht kann mir ja wer bei meinem Problem helfen:
    ich habe ein Objekt als Membervariable in einer Klasse definiert.
    Bei dieser Definition beschwert er sich, dass er die Klasse des Objekts nicht kennt:

    class InputParser;

    class InputClient
    {
    private:
    InputParser myInputParser_;
    public:
    InputClient();
    virtual ~InputClient(){};
    };

    so sieht mein h file aus.....der compiler beschwert sich, dass er die klasse InputParser nicht kennt.

    Danke für jede hilfe.

    mfg kathi



  • Wenn Du die Client Klasse nicht im Parser brauchst:

    #include "InputParser.h"
    

    in diesem .h File

    Die Vorabdeklaration kannste dann weglassen:

    #include "InputParser.h"
    
    class InputClient
    {
    private:
        InputParser myInputParser_;
    public:
        InputClient();
        virtual ~InputClient(){};
    };
    


  • Die Forward Deklaration ("class InputParser;") reicht aus, um Pointer, Referenzen und Funktionsparameter deklaraieren zu können - um ein komplettes Memberobjekt anlegen zu können, benötigt der Compiler aber dessen Größe (und dafür die komplette Definition des Datentyps).



  • hallo,

    danke für die antwort aber diese ist bereits inkludiert.

    #include "InputParser.h"
    #include "Stackrechner.h"
    #include <list>
    using std::list;

    mfg kathi



  • Kathi schrieb:

    hallo,

    danke für die antwort aber diese ist bereits inkludiert.

    Wo? Hoffentlich VOR der Definition für "InputClient".



  • CStoll schrieb:

    Die Forward Deklaration ("class InputParser;") reicht aus, um Pointer, Referenzen und Funktionsparameter deklaraieren zu können - um ein komplettes Memberobjekt anlegen zu können, benötigt der Compiler aber dessen Größe (und dafür die komplette Definition des Datentyps).

    heißt das jetzt, dass ich diese beide klassen zusammen in ein file schreiben soll, damit das funktioniert?

    mfg kathi



  • #pragma once
    #include "InputParser.h"
    #include "Stackrechner.h"
    #include <list>
    using std::list;

    class InputParser;

    class InputClient
    {
    //friend class InputParser;
    private:
    InputParser myInputParser_;
    public:
    InputClient();
    virtual ~InputClient(){};
    void handleInput(InputParser myInputParser);
    // InputClient(InputParser *myInputParser) : myInputParser_(myInputParser){};

    };

    so schaut mein anfang aus. wenn ich die vorabdeklaration weglasse, kommen noch mehr fehlermeldungen.

    mfg kathi



  • Zeig mal noch die InputParser.h.
    Hast Du da InputClient dort auch includiert? Dann gehts nämlich im Kreis rum..



  • 1310-Logik schrieb:

    Zeig mal noch die InputParser.h.
    Hast Du da InputClient dort auch includiert? Dann gehts nämlich im Kreis rum..

    #pragma once
    #include "Stackrechner.h"
    #include "InputClient.h"
    #include <string>
    using std::string;

    //class InputClient;

    class InputParser
    {
    //friend class InputClient;

    private:
    bool isOperator_;
    bool isValue_;
    int operator_;
    double value_;
    bool ifSigned_;
    char sign_;

    public:
    InputParser();
    virtual ~InputParser(){};
    void getInput(string input);
    bool getIsOperator();
    void setIsOperator(bool yes);
    bool getIsValue();
    void setIsValue(bool yes);
    int getOperator();
    void setOperator(int op);
    double getValue();
    void setValue(double val);
    bool getIfSigned();
    void setIfSigned(bool ifSigned);
    int getSign();// 1 = +; 2 = -;
    void setSign(int sign);
    void isOperator();
    void checkSign(string input);
    void checkOperator(string input);
    bool checkValue(string input);
    void handleInput();
    //InputParser(const InputParser &copyObj);
    //InputParser& operator=(const InputParser& op);
    };

    so sieht der inputparser.h aus.



  • using std::list ist übrigens keine gute Idee in nem Header.



  • Cpp Code Tags machens nett bunt 😉

    #pragma once
    #include "Stackrechner.h"
    #include "InputClient.h"   //<---Brauchst Du das hier? Ich glaube nicht..
    #include <string>
    using std::string;
    
    //class InputClient;
    
    class InputParser
    {
    	//friend class InputClient;
    
    private:
    	bool isOperator_;
    	bool isValue_;
    	int operator_;
    	double value_;
    	bool ifSigned_;
    	char sign_;
    
    public:
    	InputParser();
    	virtual ~InputParser(){};
    	void getInput(string input);
    	bool getIsOperator();
    	void setIsOperator(bool yes);
    	bool getIsValue();
    	void setIsValue(bool yes);
    	int getOperator();
    	void setOperator(int op);
    	double getValue();
    	void setValue(double val);
    	bool getIfSigned();
    	void setIfSigned(bool ifSigned); 
    	int getSign();// 1 = +; 2 = -;
    	void setSign(int sign);
    	void isOperator();
    	void checkSign(string input);
    	void checkOperator(string input);
    	bool checkValue(string input);
    	void handleInput();
    	//InputParser(const InputParser &copyObj);
    	//InputParser& operator=(const InputParser& op);
    };
    

    Edit: Wenn Du in jedem Header den jeweils anderen Includierst, gibt das ein Chaos, trotz #pragma once. Wenn Du, wie oben, InputClient.h in diesem Header nicht brauchst, includier ihn erst im .cpp File, wenn Du ihn da brauchst.



  • recht herzlichen dank für eure hilfe.
    genau des war der fehler @1310-Logik 😉

    mfg kathi


Anmelden zum Antworten