Vorwärtsdeklartion (mit typedef)?



  • a.h
    ...
    #include<a.B>
    
    class A;
    typedef boost::shared_ptr<A> APtr;
    
    class A
    {
    public:
      BPtr get();
    ...
    
    b.h
    #include<a.h>
    ...
    class B;
    typedef boost::shared_ptr<B> BPtr;
    
    class B : public A
    {
    ...
    

    Die gegenseitgen Anhängigkeiten führen zu logischerweis hier zu Übersetzungsfehlern. In der Regel läßt es sich vermeiden indem man den typedef vor einen bestimmten include durchführt.

    Das Problem erscheint derzeit beim Umstellen von Raw-Pointern, bei der die Vorwärtsdeklaration der Klasse ausreichend ist, auf shared-Pointer.

    Kann man das Problem irgendwie anders lösen?
    Da ich in den Klassen bereits mit den typedefs arbeite soll der typedef auch vor der Klassendeklaration durchgeführt werden.

    Gruß,
    SirAnn


  • Mod

    boost::shared_ptr<X> benötigt keinen vollständigen Typen bei der Instantiierung. Die Verwendung anstelle von rohen Zeigern sollte also problemlos möglich sein.



  • Hi camper
    das ist korrekt (sonst würde meien vorwärtsdeklaration im Bsp auch nicht funktionieren).

    mein Problem ist eher das, dass ich in ausschließlich mit den typedefs arbeiten möchte und diese auch in der jeweiligen Klassendeklaration unterbringen möchte.

    und eine Vorwärtsdeklaration a la

    class APtr;
    

    resultiert in einem "alredy defines APtr


  • Mod

    Ich bin nicht sicher, ob ich das Problem richtig verstanden habe - aber evtl. könntest du a.h und b.h aufteilen, indem du den rein deklaratorischen Teil ausgliederst, ungefähr so:

    a_fwd.h
    
    class A;
    typedef boost::shared_ptr<A> APtr;
    
    a.h
    #include "a_fwd.h"
    #include "b_fwd.h"
    class A
    {
    public:
      BPtr get();
    ...
    
    b_fwd.h
    class B;
    typedef boost::shared_ptr<B> BPtr;
    
    b.h
    #include "b_fwd.h"
    #include "a.h"
    class B : public A
    {
    ...
    

    ungefähr so, wie es <ios> und <ios_fwd> gibt.



  • ah, verstehe. okay! so kann ich es natürlich lösen.

    danke!


Anmelden zum Antworten