Inline Konstruktoren/Destruktoren



  • Hallo allerseits,

    ich bin noch ein blutiger C++ Anfänger, habe bisher nur einigermaßen C und exzessiv JAva programmiert.

    Nun habe ich folgendes Problem.

    Ich habe 2 Headerdateien (mein Browser stellt in der Vorschau die Codebereiche doppelt dar! Ich hoffe, die werden nicht so gepostet!):

    MenusC.h

    #ifndef MENUS_H
    #define MENUS_H
    
    #include <list>
    
    #include "MenuC.h"
    
    class MenusC
    {
     public:
      MenusC() {}
      ~MenusC() {}
    
      void addMenu(MenuC& menu) { menus.push_back(menu); };
    
     private:
      list<MenuC> menus;
    
    };
    
    #endif
    

    und MenuC.h:

    #ifndef MENU_H
    #define MENU_H
    
    #include <list>
    #include <typeinfo>
    
    #include "MenuEntryC.h"
    #include "MenuTitleC.h"
    #include "MenuItemC.h"
    #include "MenuSeperatorC.h"
    
    class MenuC
    {
     public:
      MenuC() {}
      ~MenuC() {}
    
      void setTitle(MenuTitleC& menuTitle)
      {
       // Am Anfang der Liste steht immer der Menütitel!
       if (typeid(entries.pop_front()) == typeid(MenuTitleC))
       {
        entries.pop_front();
       }
       entries.push_front(menuTitle);
      };
      void addItem(MenuItemC& menuItem) { entries.push_back(menuItem); };
      void addSeperator(MenuSeperatorC& menuSeperator) { entries.push_back(menuSeperator); };
    
     private:
      list<MenuEntryC> entries;
    
    };
    
    #endif
    

    In der Klasse mit der Main-Methode steht nun folgendes:

    #include "MenuC.h"
    #include "MenusC.h"
    .
    .
    .
    MenusC menus;
    MenuC file;
    .
    .
    .
    

    Ich verwende GCC 3.3 und g++ bringt nun folgende Fehler:

    undefined reference to MenusC::~MenusC(void)' undefined reference toMenuC::~MenuC(void)'
    undefined reference to MenusC::MenusC(void)' undefined reference toMenuC::MenuC(void)'
    undefined reference to MenuC::~MenuC(void)' undefined reference toMenusC::~MenusC(void)'

    Woran liegt das? Brauche ich immer *.cc Dateien, die mit diesen *.h Dateien compiliert und gelinkt werden, bevor sie woanders verwendet werden können?

    In anderen Klassen, die hier z.T. Verwendung finden (MenuItemC, MenuSeperatorC) befinden sich ebenfalls inline Destruktoren. Zu diesen Klassen exisiteren *.cc Dateien und es werden Objectdateien erzeugt. Außer bei einer bekomme ich die o.a. Fehlermeldungen für diese Klassen aber nicht!
    Bei Bedarf kann ich deren Code auch noch posten!

    Da blick ich nicht durch!

    Kann mir jmd. nen Tip geben?

    Vielen Dank schon einmal!

    Ciao



  • ich nehme mal an das du MenusC.o und MenuC.o nicht zu deinem projekt dazugelinkt hast.
    K.



  • ZuK schrieb:

    ich nehme mal an das du MenusC.o und MenuC.o nicht zu deinem projekt dazugelinkt hast.
    K.

    Die hab ich vom g++ gar nicht erzeugen lassen, dass es keine Sourcefiles gibt, nur die Headerfiles.
    Muss ich demzufolge immer auch *.cc Dateien erstellen, um die Objectfiles zu erzeugen?
    Ich hab gedacht, die werden dann implizit bei der Verwendung durch

    #include "MenuC.h"
    #include "MenusC.h"

    erzeugt!?

    Kann ich dann keine Files erstellen, die Deklaration und Definition komplett enthalten oder müssen diese dann Sourcefiles sein?

    Als ich MenusC.h und MenuC.h in MenusC.cc und MenuC.cc umbenannt hatte und die #ifdefs entfernt waren, ich die Dateien wie alle anderen auch compilieren wollte, kamen auf einmal Fehler in anderen Dateien, die bisher problemlos compiliert wurden???

    Alles sehr seltsam 😕

    Ciao



  • Sorry, Ich habe übersehen dass deine Klassen MenuC und MenusC komplett inline deklariert sind.

    Muss ich demzufolge immer auch *.cc Dateien erstellen, um die Objectfiles zu erzeugen?

    Nein, natürlich nicht. .
    Tatsache ist dass der linker die destruktoren nicht findet.
    es wäre vielleicht hifreich wenn du die vollsändigen fehlermeldungen des linkers posten könntest.
    K.



  • Problem gelöst.

    Die Klasse, welche MenuC.h und MenusC.h verwendete wurde von mir versehentlich im makefile auskommentiert, so dass ein altes Objectfile verwendet wurde!

    Nun tut es.

    Danke und bis zum nächsten Mal

    Ciao


Log in to reply