2015-12-30 7 views
11

Für ein typedef ein struct in C, ich kann das nicht tun:Wie deklariert ein selbstreferenzieller Container in C++?

typedef struct { 
    unsigned id; 
    node_t *left; 
    node_t *right; 
} node_t; 

weil node_t nicht bekannt ist, bis es definiert ist, so kann es nicht in ihrer eigenen Definition verwendet werden. Ein bisschen Catch-22. Allerdings kann ich diese Abhilfe verwenden, um die gewünschte selbstbezüglicher Art zu machen:

typedef struct node_s node_t; 
struct node_s { 
    unsigned id; 
    node_t *left; 
    node_t *right; 
}; 

Ebenso würde ich so etwas wie dies für eine C++ Container selbst bezieht tun:

typedef pair<unsigned, pair<node_t *, node_t * > > node_t; 

aber von Natürlich beschwert sich der Compiler, dass es noch nie von node_t gehört hat, bevor es node_t definiert wird, wie es für die struct typedef oben wäre.

Also gibt es einen Workaround wie für die struct? Oder einen besseren Weg, dies zu tun? (Und nein, ich möchte nicht void Zeiger verwenden.)

+0

Hilft dies: [STL map auf sich selbst?] (Http://stackoverflow.com/questions/1403501/stl-map-onto-itself) –

+2

Sie können sich die Realisierung von http: //www.boost ansehen. org/doc/libs/1_57_0/boost/variant/recursive_variant.hpp oder http://www.boost.org/doc/libs/1_57_0/boost/variant/recursive_wrapper.hpp – ForEveR

+1

Ihr erster Fall ist kein Problem in C++ : 'struct node_t {node_t * left 'node_t * rechts; }; 'ist völlig in Ordnung. Außerdem ist "std :: pair" kein Container. – juanchopanza

Antwort

8

Sie können es wie folgt tun:

struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > > 
{}; 

Nach struct node_t der Compiler weiß, dass der Typ mit dem Namen node_t, ähnlich einer Vorwärtsdeklaration besteht.

+0

Perfekt. Vielen Dank. –

3

Die Sprache unterstützt keine Vorwärtsdeklaration von typedef s. Daher können Sie nicht verwenden:

typedef pair<unsigned, pair<node_t *, node_t * > > node_t; 

Sie können den Begriff eines Behälter erreichenstruct node_t {...}; mit, die ich nicht Ausarbeitung sicher Bedürfnisse bin.