Methodenaufruf inline



  • Hallo allerseits,

    ich hab von C++ noch nich so viel Ahnung und darum eine Frage:

    Kann ich in einer Inline-Deklaration auch einen Methodenaufrauf starten?

    Folgende Situation:

    Ich habe eine *.h Datei in der verschiedene public Setter aufgelistet sind, die alle auf eine private-Methode zugreifen sollen.

    Die Klasse ist komplett inline definiert und es existiert deswegen kein *.cc File!

    Nun meint mein GCC (2.95.3) bei der 2. public set*** Methode welche inline die private Methode aufruft "implicit declaration of... [int privateMethode]".
    Die private Methode hat void als Rückgabeparameter.

    Nun ist es so, dass der GCC diese Fehlermeldung immer bei der 2. Anweisung dieser Art meldet, nie bei der ersten!

    Woran kann das liegen?

    Danke schon mal!

    Ciao



  • Nein das geht nicht...



  • Da muß ich ihm leider recht geben....
    Da brauchst du ne andere Lösung



  • Reth schrieb:

    Hallo allerseits,
    ich hab von C++ noch nich so viel Ahnung und darum eine Frage:
    Kann ich in einer Inline-Deklaration auch einen Methodenaufrauf starten?

    eigentlich bedarf es dazu einer inline-definition. aber ist egal, du wirst definition schon gemeint haben.

    Folgende Situation:
    Ich habe eine *.h Datei in der verschiedene public Setter aufgelistet sind, die alle auf eine private-Methode zugreifen sollen.

    guter plan.

    Die Klasse ist komplett inline definiert und es existiert deswegen kein *.cc File!

    nenn sie besser *.cpp. du kannst wesentlich leichter umsteigen als die winner. und viele linuxer sind langsam so vernünftig, von *.C und *.cc und *.cxx und so abzulassen, um einfach zu erleichtern, daß ganze projekte plattformübergreifend funktionieren.

    Nun meint mein GCC (2.95.3) bei der 2. public set*** Methode welche inline die private Methode aufruft "implicit declaration of... [int privateMethode]".
    [...]
    Woran kann das liegen?

    das sagt er mir nur, wenn ich eine funktion aufrufe, die nicht existiert. tippfehler im namen der aufzurufenden funktion.



  • volkard schrieb:

    einer inline-definition. aber ist egal, du wirst definition schon gemeint haben.

    Äh sorry ja, meinte ich!

    guter plan.

    Danke 😃

    das sagt er mir nur, wenn ich eine funktion aufrufe, die nicht existiert. tippfehler im namen der aufzurufenden funktion.

    Kann eigentlich nicht sein, da ich die Methode mit Copy&Paste angelegt habe.
    Zudem kann ich die Methoden vertauschen, der Compiler meckert immer bei der Zweiten!
    Hier mal die ganze Klassendefinition zur Übersicht:

    #ifndef WINDOWDATA_H
    #define WINDOWDATA_H
    
    #include <string>
    #include <intuition/intuition.h>
    
    class WindowDataC
    {
        private:
    		ULONG windowLeft, windowTop, windowWidth, windowHeight, flagsIDCMP;
    		BOOL dragBar, borderless, reportMouse, newLookMenus, sizeGadget, depthGadget, closeGadget, activate,
    			 noCareRefresh, backdrop, trapRMB, gimmeZeroZero, autoAdjust, menuHelp, notifyDepth;
    		string windowTitle;
    
    		inline void setIDCMPFlag(ULONG flag) { flagsIDCMP = flagsIDCMP | flag; }
    
    	public:
    		WindowDataC() : flagsIDCMP(0) {}
    		~WindowDataC() {}
    
    		void setLeft(const ULONG left = 0) { windowLeft = left; }
    		void setTop(const ULONG top = 0) { windowTop = top; }
            void setWidth(const ULONG width = STDSCREENWIDTH) { windowWidth = width; }
    		void setHeight(const ULONG height = STDSCREENHEIGHT) { windowHeight = height; }
    		void setTitle(const string title = "") { windowTitle = title; }
    		void setDragBar(const BOOL setDragBar = TRUE) { dragBar = setDragBar; }
    		void setBorderless(const BOOL setBorderless = FALSE) { borderless = setBorderless; }
    		void setReportMouse(const BOOL setReportMouse = TRUE) { reportMouse = setReportMouse; }
    		void setNewLookMenus(const BOOL setNewLookMenus = TRUE) { newLookMenus = setNewLookMenus; }
    		void setSizeGadget(const BOOL setSizeGadget = TRUE) { sizeGadget = setSizeGadget; }
    		void setDepthGadget(const BOOL setDepthGadget = TRUE) { depthGadget = setDepthGadget; }
    		void setCloseGadget(const BOOL setCloseGadget = TRUE) { closeGadget = setCloseGadget; }
    		void setActivate(const BOOL setActivate = TRUE) { activate = setActivate; }
    		void setNoCareRefresh(const BOOL setNoCareRefresh = TRUE) { noCareRefresh = setNoCareRefresh; }
    		void setBackdrop(const BOOL setBackdrop = FALSE) { backdrop = setBackdrop; }
    		void setRMBTrap(const BOOL setRMBTrap = FALSE) { trapRMB = setRMBTrap; }
    		void setGimmeZeroZero(const BOOL setGimmeZeroZero = FALSE) { gimmeZeroZero = setGimmeZeroZero; }
    		void setAutoAdjust(const BOOL setAutoAdjust = TRUE) { autoAdjust = setAutoAdjust; }
    		void setMenuHelp(const BOOL setMenuHelp = TRUE) { menuHelp = setMenuHelp; }
    		void setNotifyDepth(const BOOL setNotifyDepth = TRUE) { notifyDepth = setNotifyDepth; }
    		void notifyNewSize() { setIDCMPFlag(IDCMP_NEWSIZE); }
    		void notifyRefreshWindow() { setIDCMPFLag(IDCMP_REFRESHWINDOW); }
    		void notifyMouseButtons() { setIDCMPFLag(IDCMP_MOUSEBUTTONS); }
    		void notifyMouseMove() { setIDCMPFLag(IDCMP_MOUSEMOVE); }	// nur wenn ReportMouse gesetzt wurde
    		void notifyGadgetDown() { setIDCMPFLag(IDCMP_GADGETDOWN); }
    		void notifyGadgetUp() { setIDCMPFLag(IDCMP_GADGETUP); }
    		void notifyMenuPick() { setIDCMPFLag(IDCMP_MENUPICK); }
    		void notifyCloseWindow() { setIDCMPFLag(IDCMP_CLOSEWINDOW); }
    		void notifyIntuiTicks() { setIDCMPFLag(IDCMP_INTUITICKS); }
    		void notifyActiveWindow() { setIDCMPFLag(IDCMP_ACTIVEWINDOW); }
    		void notifyInactiveWindow() { setIDCMPFLag(IDCMP_INACTIVEWINDOW); }
    		void notifyChangeWindow() { setIDCMPFLag(IDCMP_CHANGEWINDOW); }
    		void notifyMenuHelp() { setIDCMPFLag(IDCMP_MENUHELP); }
    		void notifiyIDMCP(ULONG flags = 0) { setIDCMPFlag(flags); }
    
    		ULONG getLeft() const { return windowLeft; }
    		ULONG getTop()const { return windowTop; }
    		ULONG getWidth() const { return windowWidth; }
    		ULONG getHeight()const { return windowHeight; }
    		string getTitle() const { return windowTitle; }
    		BOOL hasDragBar() const { return dragBar; }
    		BOOL isBorderless() const { return borderless; }
    		BOOL hasReportMouse() const { return reportMouse; }
    		BOOL hasNewLookMenus() const { return newLookMenus; }
    		BOOL hasSizeGadget() const { return sizeGadget; }
    		BOOL hasDepthGadget() const { return depthGadget; }
    		BOOL hasCloseGadget() const { return closeGadget; }
    		BOOL isActivate() const { return activate; }
    		BOOL hasNoCareRefresh() const { return noCareRefresh; }
    		BOOL isBackdrop() const { return backdrop; }
    		BOOL hasRMBTrap() const { return trapRMB; }
    		BOOL isGimmeZeroZero() const { return gimmeZeroZero; }
    		BOOL isAutoAdjust() const { return autoAdjust; }
    		BOOL hasMenuHelp() const { return menuHelp; }
    		BOOL hasNotifyDepth() const { return notifyDepth; }
    
    };
    
    #endif
    

    Keine Ahnung worans liegt. Offenbar geht das nicht, so wie die zwei anderen Poster das auch meinten!? 😕



  • und welchen fehler meldet der compiler genau?
    deine meldungen mit "ein fehler bei set*" sind nicht extrem hilfreich, wenn ich bei dieser monsterklasse nen tippfehler suche.

    wo ist die setIDCMPFLag() definiert oder deklariert?



  • volkard schrieb:

    wo ist die setIDCMPFLag() definiert oder deklariert?

    Oder besser: wie?



  • Die Methode steht doch oben unterhalb der private-Variablen. Sie ist als private-Methode angelegt.

    Tippfehler schließe ich wie gesagt ja aus!

    Wieso Monsterklasse? Ist sie denn so extrem groß?
    Wie splittet man denn sowas ansonsten (wenn man Fensterdaten darstellen will, könnte höchstens die notify-Sachen in ner Extraklasse kapseln die dann nur intern verfügbar ist)?

    Die Fehlermeldung ist:
    implicit declaration of function int setIDCMPFlag(...)

    Und zwar bei der Zeile mit notifyRefreshWindow...
    Hatte diese Zeile aber schon mit der darunter stehenden vertauscht. Fehler wurde dann bei dieser Funktion gemeldet.
    In der darüberliegenden Zeile ist die Inlinemethode aber genauso benutzt!

    😕



  • Reth schrieb:

    Tippfehler schließe ich wie gesagt ja aus!

    man achte auf das 'L' bzw 'l' in "setIDCMPFLag()" bzw "setIDCMPFlag()" tt



  • Reth schrieb:

    Die Fehlermeldung ist:
    implicit declaration of function int setIDCMPFlag(...)

    und jetzt statt ... bitte den ganzen text.
    vielleicht bringt mich das auf ne idee.
    aber vermutlich nicht. der von dir geschilderte fehler kann gar nicht sein.



  • Hier der gesamte Fehler, inkl. ner Warning.

    Am Ende ist es (hoffentlich) wieder was Banales, was ich übersah!

    g++ -c -o o/gcc-classic-stable/WindowC.o WindowC.cc
    In file included from WindowC.h:5,
    from WindowC.cc:5:
    WindowDataC.h: In method void WindowDataC::notifyRefreshWindow()': WindowDataC.h:42: implicit declaration of functionint setIDCMPFLag(...)'
    WindowC.cc: In method `void WindowC::open(const WindowDataC &)':
    WindowC.cc:9: warning: converting NULL to non-pointer type
    make: *** [o/gcc-classic-stable/WindowC.o] Error 1
    Done.



  • dann schauen wir uns das mal an:

    WindowDataC.h:42: implicit declaration of function `int setIDCMPFLag(...)'

    hmm der von life genannte verschreibsler, denn in deiner Klasse steht das:
    [cpp]
    inline void setIDCMPFlag(ULONG flag) { flagsIDCMP = flagsIDCMP | flag; }
    [/cpp]



  • Danke für die Aufklärung!
    Man wie peinlich! Obwohl ich die Methoden immer kopiert hatte!

    Bin ja froh, dass es nur ein Tippfehler war!

    Danke für alle Hilfen!



  • Hi Reth,

    du scheinst ja die Amiga Intuition Lib nachbilden zu wollen.
    Das habe ich auch schon getan und somit ein paar alte Amiga-Programme (in C geschrieben) unter Windows zum Laufen gebracht (mit dem Borland C++ Bilder 5).

    Falls du weitere Hilfe brauchst oder einige Dateien (bzw Source-Code), dann mail mir einfach an:
    privat: TBentrup@bitel.net
    bzw.
    Arbeit: T.Bentrup@ascaron.com



  • Th schrieb:

    Hi Reth,

    du scheinst ja die Amiga Intuition Lib nachbilden zu wollen.
    Das habe ich auch schon getan und somit ein paar alte Amiga-Programme (in C geschrieben) unter Windows zum Laufen gebracht (mit dem Borland C++ Bilder 5).

    Falls du weitere Hilfe brauchst oder einige Dateien (bzw Source-Code), dann mail mir einfach an:
    privat: TBentrup@bitel.net
    bzw.
    Arbeit: T.Bentrup@ascaron.com

    Hey, dachte nicht, dass das so schnell erkannt wird!

    Nun ja stimmt nicht ganz. Ich mach mir ein paar Klassen in C++, damit ich auf meinem A4000 mit dem GCC in C++ mein Amigaprogramm entwickeln kann.

    Werde aber gern auf Dein Angebot zurückkommen, wenn ich wieder mal festhänge!
    Danke!


Anmelden zum Antworten