Liste für 2 Structs

  • Themenstarter Themenstarter Need_Name
  • Beginndatum Beginndatum
N

Need_Name

Hallo!

Ich würde gerne eine Liste für 2 verschiedene Structs erstellen.
Es ist so, dass je nach Benutzereingabe die Daten in eines der beiden Structs gespeichert werden.
Mein Problem is jetzt wie ich die 2 Structs miteinander verknüpfe, damit ich eine Liste für die beiden Structs zusammen bekomme.

Code:
typedef struct
{
  char *text;
  int position_x;
  int position_y;
  int font_size;
  char *fill;
  int group;
  int counter_user_input;
}Text;

typedef struct
{
  char *image_url;
  int position_x;
  int position_y;
  int width;
  int heigth;
  int group;
  int counter_user_input;
}Image;

Danke schon mal im Voraus!
 
Hallo,
wenn es um C++ geht, kannst du deine beiden structs von einer gemeinsamen Basisklasse ableiten
und danach in einer Liste in beliebiger Menge und Reihenfolge ablegen.
Beispiel
C++:
// Deklarationen
struct Listenelement {
};

struct Text : Listenelement {
  char *text;
  int position_x;
  int position_y;
  int font_size;
  char *fill;
  int group;
  int counter_user_input;
};

struct Image : Listenelement {
  char *image_url;
  int position_x;
  int position_y;
  int width;
  int heigth;
  int group;
  int counter_user_input;
};

// Implementierung
#include <vector>
using namespace std;

int main (int argc, char** argv) {
// Liste anlegen
  vector<Listenelement*> liste;

  Text* new_text = new Text();
  new_text.text = "hallo user";
  liste.push_back(new_text);

  Image* new_image = new Image();
  new_image.image_url = "www.meerschweinchen.de";
  liste.push_back (new_image);

// ab hier könnte man mit der Liste irgendetwas machen
// ...

// ab hier wird aufgeräumt
  for (vector<Listenelement*>::iterator iter = liste.begin(); iter != liste.end(); ++iter)
    delete *iter;    // den vorher mit "new" reservierten Speicher wieder freigeben

// ende
  return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
Ehm ja danke schon mal für deinen rasche Antwort muss das Ganze jedoch in C realisieren. Gibts dort auch soetwas wie gemeinsame Basisklassen? Oder kann ich mit einem gemeinsamen Pointer auf die unterschiedlichen Structs zugreifen?
Lg
 
Hallo,

du könntest eine union verwenden:

C:
#define TYPE_TEXT 1
#define TYPE_IMAGE 2

typedef struct
{
  int type;
  union {
    Text text;
    Image image;
  };
} TextOrImage;
Du musst dann nur den type entsprechend setzen (TYPE_TEXT oder TYPE_IMAGE).

Grüße,
Matthias
 
Aha super Danke!
Hätte aber noch eine Frage und zwar wenn ich das jetzt über Union mache, kann ich ja nur auf einen der beiden Structs zugreifen oder?
Wenn ich jetzt meine Liste realisien will, kann ich in der Liste immer nur Text oder Image stehen haben oder auch einmal Text und einmal Image?
Lg
 
Aha super Danke!
Hätte aber noch eine Frage und zwar wenn ich das jetzt über Union mache, kann ich ja nur auf einen der beiden Structs zugreifen oder?
Wenn ich jetzt meine Liste realisien will, kann ich in der Liste immer nur Text oder Image stehen haben oder auch einmal Text und einmal Image?
Letzteres. Beispiel:
C:
int main(void) {
  TextOrImage mixed_array[3];
  mixed_array[0].type = TYPE_TEXT;
  mixed_array[0].text.text = "tutorials.de";
  mixed_array[1].type = TYPE_IMAGE;
  mixed_array[1].image.image_url = "http://www.tutorials.de/forum/images_v6/misc/tuts_default.gif";
  mixed_array[2].type = TYPE_TEXT;
  mixed_array[2].text.text = "User helfen Usern";

  int i;
  for (i = 0; i < 3; ++i) {
    switch (mixed_array[i].type) {
      case TYPE_TEXT:
        printf("Text: %s\n", mixed_array[i].text.text);
        break;
      case TYPE_IMAGE:
        printf("Image: %s\n", mixed_array[i].image.image_url);
        break;
    };
  }

  return 0;
}

Ausgabe:
Code:
Text: tutorials.de
Image: http://www.tutorials.de/forum/images_v6/misc/tuts_default.gif
Text: User helfen Usern

Grüße,
Matthias
 
Meines Wissens sollte man union eher vermeiden. Jedenfalls stehts in einigen Büchern.

Aber ist nicht struct C? Oder wurde die Ableitung erst in C++ "erfunden"?
 
Meines Wissens sollte man union eher vermeiden. Jedenfalls stehts in einigen Büchern.
Enthalten diese Bücher auch eine Begründung für diesen Rat? Gefährlich (im Sinne von nicht-portabel) wird es denke ich nur, wenn man in ein Feld etwas reinschreibt, um die Daten anschließend aus einem anderen Feld wieder auszulesen. Das passiert allerdings hier nicht.

Aber ist nicht struct C? Oder wurde die Ableitung erst in C++ "erfunden"?
struct ist Bestandteil von C und C++, Ableitungen gibt es nur in C++.

Grüße,
Matthias
 
Zurück