2010-11-23 18 views
8
typedef struct { 
    NSString *activty; 
    NSString *place; 
    float latitude; 
    float longitude; 
} event; 

typedef struct { 
    event *thing; 
    Node *next; 
} Node; 

Este es el código que tengo en mi archivo .h para crear dos estructuras para almacenar los datos (una para un nombre de eventos/lugar/ubicación, y uno de los nodos de una lista enlazada .Puedo usar la estructura del evento en la estructura del nodo, pero necesito usar la estructura del nodo dentro de sí misma. En C++ esto funcionaría, pero ¿cómo puedo lograr esto en Objectivo-c? ¡Gracias!Creación de listas enlazadas en Objective C

Respuesta

21

¿Por qué molestarse con una estructura? Sólo tiene que utilizar una clase:

@interface MyEvent:NSObject 
@property(copy) NSString *activity; 
@property float latitude; 
... etc ... 
// and that linked list gunk 
@property(retain) MyEvent *nextEvent; 
@end 

@implementation MyEvent 
@synthesize activity, latitude, nextEvent; 

- (void) dealloc 
{ 
    [activity release], activity = nil; 
    [nextEvent release], nextEvent = nil; 
    [super dealloc]; 
} 
@end 

No hay sobrecarga significativa frente a una estructura (si las llamadas a métodos son realmente medible, incluso se podría exponer directamente Ivars). Mejor aún, en el momento que desee archivar la estructura, agregar lógica comercial o hacer cualquier otra cosa interesante, simplemente puede agregar métodos.

+0

No es una lista vinculada. –

+0

@tc, tampoco es la estructura original de 'evento 'de OP, bbum está señalando que una clase sería una mejor alternativa a una estructura de C vainilla según sus razones antes mencionadas. – dreamlax

+1

Allí; ahora es una lista enlazada. :) – bbum

2

Necesitas el nombre de su estructura como lo haría en C. Por ejemplo:

typedef struct Node { 
    event *thing; 
    struct Node *next; 
} Node; 

Una mejor pregunta, sin embargo, es ¿por qué quiere hacer t su lista de enlaces en primer lugar? ¿Por qué no utilizar uno de los tipos de contenedores proporcionados por el marco?

+0

¿Qué sugeriría utilizar en su lugar para mantener múltiples tipos de datos conectados? ¿Debo simplemente almacenar mis estructuras de eventos en un NSMutableArray? – Inanepenguin

+0

Eso sería lo normal. Si desea un enfoque compuesto (por ejemplo, para poder pasar estructuras simples al código C existente), puede usar NSValue + valueWithPointer: para crear un objeto capaz de entrar en una colección Objective-C pero que no hace más que apuntar a algo más. – Tommy

+0

Una última pregunta: No puedo usar addObject para insertar la estructura en la matriz ... ¿Cuál sería la forma correcta de hacerlo? ¡Gracias! – Inanepenguin

-1

Creo que encontrará que no funciona en C++ (pero pueden haber cambiado las reglas de gramática para que así sea). Es probable que decir algo más parecido a esto:

struct Node { 
    event *thing; 
    Node *next; 
}; 

que funciona en C++ porque Node es equivalente a struct Node si no hay ya algo llamado Node (esto a veces provoca errores desconcertantes cuando Foo es a la vez una clase y el método de instancia de otra clase, lo que sucede en algunos estilos de codificación).

La solución es decir struct Node. Prefiero esto; parece más puro. Hay algunas buenas razones para usar un typedef (por ejemplo, cosas como TUInt64 que históricamente pueden haber sido una estructura debido a la falta de compatibilidad con el compilador). Si usa un typedef, no hay razón para darle a la estructura un nombre diferente ya que están en diferentes espacios de nombres (las estructuras de IIRC son un "espacio de nombres de etiquetas").

La versión habitual typedef es algo como esto:

typedef struct Node Node; 
struct Node { 
    event *thing; 
    Node *next; 
}; 

alternativa, cambiar la extensión del archivo a .MM y entonces funciona porque estás compilando Objective-C++!

Cuestiones relacionadas