2010-04-24 7 views
24

Ich versuche, eine Python-Routine zu beschleunigen, indem Sie es in C++ schreiben und dann mit Ctypes oder Cython verwenden.Kann eine C++ - Klasse sich selbst als Mitglied enthalten?

Ich bin brandneu in C++. Ich verwende Microsoft Visual C++ Express, da es kostenlos ist.

Ich habe vor, einen Ausdrucksbaum zu implementieren und eine Methode, um es in Postfix-Reihenfolge auszuwerten.

Das Problem, das ich in sofort ausgeführt werden soll:

class Node { 
    char *cargo; 
    Node left; 
    Node right; 
}; 

ich nicht left oder right als Node Arten erklären kann.

Antwort

63

Nein, weil das Objekt unendlich groß wäre (weil jeder Node hat als Mitglieder zwei weitere Node Objekte, die jeweils als Mitglieder zwei weitere Node Objekte, die jeweils ... na ja, Sie erhalten den Punkt).

Sie haben jedoch einen Zeiger auf den Klassentyp als Member-Variable:

class Node { 
    char *cargo; 
    Node* left; // I'm not a Node; I'm just a pointer to a Node 
    Node* right; // Same here 
}; 
8

Nein, aber es kann eine Referenz oder einen Zeiger auf sich haben:

class Node 
{ 
    Node *pnode; 
    Node &rnode; 
}; 
+1

Referenzen funktionieren in diesem Fall nicht wirklich, weil sie nicht null sein dürfen, und Sie brauchen Null-Endungen oder der Graph wäre unendlich. – Blindy

+3

Sie könnten einen Dummy-Knoten erstellen, um das Tempo von NULL zu nehmen. Dies funktioniert jedoch nicht gut, da Verweise nicht auf etwas anderes neu zugewiesen werden können, und eine Änderung an jeder Verbindung würde die Rekonstruktion aller Knoten bis zum Stamm erfordern. – Potatoswatter

+0

@Blindy: Sie könnten die Knotenreferenz auch auf '* this' setzen anstatt auf NULL. – MSalters

21

Nur für Vollständigkeit, beachten Sie, dass eine Klasse eine statische Instanz von sich selbst enthalten:

class A 
{ 
    static A a; 
}; 

Dies liegt daran, statische Mitglieder werden nicht wirklich in den Klasseninstanzen gespeichert, daher gibt es keine Rekursion.

+0

Dies hat meinen Kopf ein wenig umgedreht, also würde ich etwas hinzufügen: In diesem Fall speichert jede Instanz der Klasse 'A' nur einen Zeiger auf einen Speicherplatz, der im statischen Speicher für die bestimmte 'a' -Instanz reserviert ist. Also hat die 'a' Instanz auch einen Zeiger, der unendlich auf sich selbst zeigt: 'A * someA = neues A;' 'someA ->. Aaa...etc.' (angenommen, 'a' ist ein öffentliches Attribut) und deshalb Speicher in endlichen verwendet. – hymced

Verwandte Themen