13 Stimmen

intelligente Zeiger, Typendefinitionen und Vorwärtsdeklarationen

Ich liebe die Verwendung von intelligenten Zeigern und habe ein wenig Code gesehen, der die folgenden Möglichkeiten gut nutzt typedef s machen sie hübscher. Zum Beispiel:

struct A {
    typedef boost::shared_ptr<A> pointer;
};

erlaubt mir zu schreiben: A::pointer a(new A);

Aber ich bin auf ein kleines Hindernis in meinem typedef Glück :-/, Vorwärts-Erklärungen...

Stellen Sie sich also folgendes Szenario vor:

struct B;
struct A {
    boost::shared_ptr<B> b_;
};

struct B {
    boost::shared_ptr<A> a_;
};

funktioniert gut genug, aber ich würde das gerne ein wenig aufräumen. Leider ist das Funktioniert nicht

struct B;
struct A {
    typedef boost::shared_ptr<A> pointer;
    B::pointer b_; // <-- error here
};

struct B {
    typedef boost::shared_ptr<B> pointer;
    A::pointer a_;
};

Ich verstehe, warum der Compiler an dieser Stelle in der Datei keine Informationen darüber hat, dass B tatsächlich einen Typ namens pointer .

Ich habe das Gefühl, dass ich zumindest für einige Dinge den alten Ansatz beibehalten muss, aber ich würde mich freuen, wenn ich einige clevere Ideen hören würde.

6voto

Puppy Punkte 141483

Die Verwendung von Typendefinitionen macht die Sache nicht schöner - sie ist wertlos. Sie können eine shared_ptr zu einem unvollständigen Typ, also verwenden Sie einfach shared_ptr<B> .

4voto

Kirill V. Lyadvinsky Punkte 92957

Wenn Sie Typedefs gemeinsam nutzen wollen, sollten Sie wahrscheinlich Namespaces für deren Deklaration verwenden:

struct A;
struct B;

namespace Aimpl {
  typedef boost::shared_ptr<A> pointer;
}

namespace Bimpl {
  typedef boost::shared_ptr<B> pointer;
}

struct A {
    Bimpl::pointer b_;
};

struct B {
    Aimpl::pointer a_;
};

3voto

Mark B Punkte 93261

Ich kann mir zwei Ansätze vorstellen:

  • Sie könnten eine ptr_for Vorlage und verwenden Sie sie etwa wie folgt ptr_for<B>::type b_ptr_;
  • Sie könnten die beiden Strukturen pimplen (ich weiß, das ist wahrscheinlich nicht das, wonach Sie suchen), so dass die Definitionen der Implementierungen beide nach den Definitionen von A y B .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X