2010-04-24 18 views
24

Estoy tratando de acelerar una rutina de python escribiéndola en C++, luego usándola usando ctypes o cython.¿Puede una clase C++ incluirse como miembro?

Soy nuevo en C++. Estoy usando Microsoft Visual C++ Express ya que es gratis.

Planeo implementar un árbol de expresiones y un método para evaluarlo en orden de postfijo.

El problema me encuentro de inmediato es:

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

no puedo declarar left o right como Node tipos.

Respuesta

63

No, porque el objeto sería infinitamente grande (porque cada Node tiene como miembros otros dos Node objetos, que tienen cada uno como miembros otros dos Node objetos, que cada uno ... bueno, usted consigue el punto).

Puede, sin embargo, tener un puntero al tipo de clase como una variable miembro:

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

No, pero puede tener una referencia o un puntero a sí mismo:

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

Las referencias realmente no funcionan en este caso porque no se les permite ser nulas, y se necesitan terminaciones nulas o el gráfico sería infinito. – Blindy

+3

Puede crear un nodo ficticio para tomar el ritmo de NULL. Sin embargo, esto no funciona bien porque las referencias no se pueden reasignar a otra cosa, y la modificación de cualquier enlace requeriría la reconstrucción de todos los nodos hasta la raíz. – Potatoswatter

+0

@Blindy: también puede configurar la referencia de nodo a '* this' en lugar de NULL. – MSalters

21

Justo para completar, tenga en cuenta que una clase puede contener una instancia estática de sí mismo:

class A 
{ 
    static A a; 
}; 

Esto es porque estático los miembros no se almacenan realmente en las instancias de la clase, por lo que no hay recursividad.

+0

Esto me ha dado un vuelco durante un rato, así que agregaría algo: en este caso, cada instancia de la clase 'A' solo almacenará un puntero a un espacio asignado en la memoria estática para la instancia 'a' particular. Entonces la instancia 'a' también tiene un puntero, apuntando a sí mismo infinitamente: 'A * someA = new A;' 'someA ->. Aaa..etc' (suponiendo que' a 'es un atributo público) y es por eso que memoria utilizada en finito – hymced

Cuestiones relacionadas