Manuel B.: struct innerhalb einer Klasse

Hi,
ich stehe momentan vor einem Problem, ds ich bisher nicht hatte.
Innerhalb einer Klasse habe ich eine Struktur. Jetzt will ich ausserhalb der Klasse auf die Elemente der Struktur zugreifen. Das ganze unter C++ (Linux 2.6, sollte aber in dem Fall egal sein, da es ISO-C++ ist, soweit ich weiss)

Die Werte sind in der STruktur vorhanden, innerhalb der Klasse kann ich darauf zugreifen.

cout << klasse.struktur[0].element << endl;

Funktioniert leider nicht. Irgendwo logisch, da struktur[0] nur innerhalb der Klasse existiert. Aber wie greif ich jetzt auf die Elemente der Struktur zu?

Wenn das schlechter Programierstil ist (ein struct ist ja fast identisch mit class), bitte ich um einen entsprechenden Hinweis, dann werd ich mir ne andere Lösung überlegen.

thx4hlp

Gruss
Manuel

  1. Moin Manuel,

    ich stehe momentan vor einem Problem, ds ich bisher nicht hatte.
    Innerhalb einer Klasse habe ich eine Struktur. Jetzt will ich ausserhalb der Klasse auf die Elemente der Struktur zugreifen. Das ganze unter C++ (Linux 2.6, sollte aber in dem Fall egal sein, da es ISO-C++ ist, soweit ich weiss)

    Die Werte sind in der STruktur vorhanden, innerhalb der Klasse kann ich darauf zugreifen.

    cout << klasse.struktur[0].element << endl;

    Funktioniert leider nicht. Irgendwo logisch, da struktur[0] nur innerhalb der Klasse existiert. Aber wie greif ich jetzt auf die Elemente der Struktur zu?

    das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung und so das richtige Forum für solche Probleme ist es eigentlich auch nicht.
    Ich vermute mal, dass du die Struktur oder die Instanz der Struktur nicht public gemacht hast.

    Wenn das schlechter Programierstil ist (ein struct ist ja fast identisch mit class), bitte ich um einen entsprechenden Hinweis, dann werd ich mir ne andere Lösung überlegen.

    Warum sollte das schlechter Programmierstil sein? Ich verwende struct zum Beispiel immer dann, wenn ich viele Eigenschaften in ein Objekt verpacken will/muss, aber keine Methoden benötigte, während bei mir in Klassen grundsätzlich alle Attribute protected sind und der Zugriff ausschließlich über get...- und set...-Methoden erfolgt. (Ausnahmen bestätigen die Regel.)

    Claus

    1. Hallo Claus,

      das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung und so das richtige Forum für solche Probleme ist es eigentlich auch nicht.

      a) Es gibt eventuell keine wirkliche Fehlermeldung.
      b) Hier im Forum darf man auch über Vogelgrippe diskutieren, was
         noch mehr off-topic ist, also ist doch etwas OO nicht so schlimm?

      Manuel, wenn du das struct auch von anderen Komponenten/Klassen aus
      benutzen willst, dann solltest du dessen Typeninformation öffentlich
      machen. Oder du erweiterst die umgebende Klasse mit Funktionen, die
      die Struktur bedienen können.

      Von schlechtem Programmierstil würde ich (auch) nicht sprechen.
      Zumindest nicht pauschal. :)

      Adé,
      Frank

      1. Moin Frank,

        das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung und so das richtige Forum für solche Probleme ist es eigentlich auch nicht.

        a) Es gibt eventuell keine wirkliche Fehlermeldung.

        Aha!
        Was ist denn eine unwirkliche Fehlermeldung, oder was meinst du mit "keine wirkliche"?
        Was passiert dann, wenn es keine Fehlermeldung gibt?
        Entweder liegt sein Problem, darin, dass - wie wir beide vermuten - er keine Zugriffsrechte hat, dann bekommt er eine Fehlermeldung vom Compiler. Oder es funktioniert anders als er erwartet. Dagegen spricht aber, dass es aus der Klasse heraus funktioniert. Ergo: Fehlermeldung.

        b) Hier im Forum darf man auch über Vogelgrippe diskutieren, was
           noch mehr off-topic ist, also ist doch etwas OO nicht so schlimm?

        Natürlich ist das nicht schlimm. Ich wollte nur darauf hinweisen, das er mit seinem Problem in einem anderen Forum vielleicht besser aufgehoben ist, da er dort kompetenter beraten werden kann. Er möchte schließlich Hilfe und nicht über Vogelgrippe labern.

        Manuel, wenn du das struct auch von anderen Komponenten/Klassen aus
        benutzen willst, dann solltest du dessen Typeninformation öffentlich
        machen.

        Sag' ich doch.

        Claus

        1. Hallo,

          dein Hinweis auf dieses Forum als nicht unbedingter bester Platz für
          die Frage, war ja auch für mich nicht sooo daneben. Aber es gibt hier
          sicherlich genügend Leute, die sich mit OO befassen und Hilfestellung
          leisten könn(t)en.

          Was ist denn eine unwirkliche Fehlermeldung, oder was meinst du mit "keine wirkliche"?
          Was passiert dann, wenn es keine Fehlermeldung gibt?

          Wenn ich soetwas versuche in MS Visual Studio, sagt mir das
          IntelliSense(r) quasi durch die Blume dass es nicht geht, indem
          das Feld gar nicht angeboten wird. ("unwirklicher Fehler" ;))
          Wenn ich es dennoch versuche, macht mir der Compiler einen Strich
          durch die Rechnung. Das wäre dann wieder der "wirkliche" Fehler. ;)

          Dagegen spricht aber, dass es aus der Klasse heraus funktioniert.

          Ist ja auch zu erwarten, dächte ich, da das Struct im Kontext der
          umgebenden Klasse deklariert wurde, allerdings eben nicht öffentlich.

          Adé,
          Frank

      2. Hallo Frank,

        a) Es gibt eventuell keine wirkliche Fehlermeldung.

        wenn ein Zugriff auf eine Datenstruktur versucht wird, gibt es entweder den Zugriff oder eine Fehlermeldung beim Zugriff.

        Manuel, wenn du das struct auch von anderen Komponenten/Klassen aus
        benutzen willst, dann solltest du dessen Typeninformation öffentlich
        machen.

        Das finde ich nicht gut im Sinne von OOP.

        Oder du erweiterst die umgebende Klasse mit Funktionen, die
        die Struktur bedienen können.

        Das finde ich gut.   :-)

        Von schlechtem Programmierstil würde ich (auch) nicht sprechen.
        Zumindest nicht pauschal. :)

        Ich fand den Wunsch von Manuel verständlich aber eher weniger der Philosophie von OOP entsprechend.
        LG, Michael Niebuhr

        1. Hi nochmal,

          der AP schrieb ja explizit nochmal in https://forum.selfhtml.org/?t=124283&m=800722

          Fehlermeldung kommt keine

          Das finde ich nicht gut im Sinne von OOP.
          Das finde ich gut.   :-)

          Wenn er das Struct _nur_ innerhalb der Klasse selbst brauch um Daten
          abzulegen, und externe Konsumenten arbeiten dann nur mit Untermengen/
          Bruchteilen des Structs, gebe ich dir recht, dann sollten oder brauchen
          die Typen-Informationen des Structs nicht öffentlich zu sein.

          Wenn externe Konsumenten allerdings mit dem Struct an sich ebenfalls
          vollständig arbeiten wollen (also z.b. auch erzeugen) dann wäre eine
          öffentliche(re) Deklaration durchaus in Betracht zu ziehen.

          Keine Ahnung, was der OP genau will :)

          Adé
          Frank

          1. Hi,

            Wenn er das Struct _nur_ innerhalb der Klasse selbst brauch um Daten
            abzulegen, und externe Konsumenten arbeiten dann nur mit Untermengen/
            Bruchteilen des Structs, gebe ich dir recht, dann sollten oder brauchen
            die Typen-Informationen des Structs nicht öffentlich zu sein.

            gut.

            Wenn externe Konsumenten allerdings mit dem Struct an sich ebenfalls
            vollständig arbeiten wollen (also z.b. auch erzeugen) dann wäre eine
            öffentliche(re) Deklaration durchaus in Betracht zu ziehen.

            Sorry, ich weiss, dass bestimmte Sprachen so etwas zulassen, aber das wäre dennoch eine "krasse" OOP-Sünde.

            Schönen Abend noch,
            Freischwimmer

    2. Moin Manuel,

      Hi,

      das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung.

      Fehlermeldung kommt keine, nur ist der Wert in der int main() nicht verfügbar.

      class Device{
      public:
          Device(char* devicelist);
          ~Device();

      int device_number;
       const char* id[];

      struct device_data{
        const char* name;
        const char* description;
        const char* filename;
       } *p_device;

      private:
       ezxml_t DeviceList(char* device_list);
       std::string devices_e;
       char devices_c[];
      };

      Ich vermute mal, dass du die Struktur oder die Instanz der Struktur nicht public gemacht hast.

      Die Struktur ist also Public.

      if(device[device_counter].name = ezxml_attr(attribute_list, "id"));

      (Wobei "device_counter" über eine for()-Schleife erhöht wird)
      Jetzt kann ich innerhalb der Klasse auf device[0].name zugreifen.
      Wenn ich allerdings aus der int main() auf diesen Wert zugreifen will:

      Device dev(devicefile);
      cout << dev.device[0].name << endl;

      Kommt die Meldung, das "device" kein Member der Klasse Device ist. Wenn ich per *p_device zugreifen will, klappt es auch nicht.

      Insgesammt will ich ein Array in der Klasse erzeugen, auf dessen Werte ich in der main() zugreifen kann. Mit Werten ausserhalb der Struktur klappt es ja auch ;)

      Bisher hatte ich noch nie eine STruktur innerhalb einer Klasse, deshalb ist das ein problem für mich, und ich komm einfach nicht weiter :(

      1. Hi,

        class Device{
        public:
            Device(char* devicelist);
            ~Device();

        int device_number;
        const char* id[];

        struct device_data{
          const char* name;
          const char* description;
          const char* filename;
        } *p_device;

        private:
        ezxml_t DeviceList(char* device_list);
        std::string devices_e;
        char devices_c[];
        };

        if(device[device_counter].name = ezxml_attr(attribute_list, "id"));

        Device dev(devicefile);
        cout << dev.device[0].name << endl;

        Kommt die Meldung, das "device" kein Member der Klasse Device ist.

        Wundert Dich das? Du hast ja nirgends ein Member mit diesem Namen deklariert.

        Wenn ich per *p_device zugreifen will, klappt es auch nicht.

        Wie hast Du das genau gemacht?

        Wenn mich mein etwas eingerostetes C++ nicht täuscht:

        dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo Andreas,

          Wenn mich mein etwas eingerostetes C++ nicht täuscht:

          dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name

          Die Klammern können hier auch weggelassen werden, was aber noch interessant ist: dev.p_device muss natürlich vorher initialisiert werden. Es wird ja in der Klassendefinition nur der Pointer deklariert, es wird keine Struktur erstellt. Im Konstruktor oder irgendwo sonst, wo's sinnig ist, müsste per new der Speicher alloziert werden. Sonst zeigt (ich kenne die C++-Sprachspezifikation nicht auswendig) der Zeiger entweder auf NULL oder er ist komplett undefiniert (d.h. da könnte alle mögliche unsinnige drinstehen, das komplett zufällig ist).

          Viele Grüße,
          Christian

          1. Hi,

            dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name

            Die Klammern können hier auch weggelassen werden,

            Mag sein. Ich halte mich da eher an die Regel "if in doubt, use them".

            Sonst zeigt (ich kenne die C++-Sprachspezifikation nicht auswendig) der Zeiger entweder auf NULL oder er ist komplett undefiniert (d.h. da könnte alle mögliche unsinnige drinstehen, das komplett zufällig ist).

            AFAIR sind in C++ keine Default-Initialisierungen vorgesehen (in C wird keine Default-Initialisierung vorgenommen, und C++ hat das vermutlich übernommen). Hab aber schon einige Jahre nichts mehr mit C++ gemacht, bin derzeit eher mit Java am Werkeln (da ist es so, daß Referenzen mit null und int/float usw. mit 0 vorbelegt sind).

            Viele Grüße,
            Christian

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          2. Hallo Andreas,

            Wenn mich mein etwas eingerostetes C++ nicht täuscht:

            dev.p_device ist ein Pointer auf Dein struct, also müßte (dev.p_device)->name

            Es wird ja in der Klassendefinition nur der Pointer deklariert, es wird keine Struktur erstellt.

            Ich initialisiere die Struktur in der gleichen Funktion, in der ich die Struktur mit Daten fülle. Muss ich dann den Pointer nochmal extra initialisieren?
            Ich hab Strukturen so im Kopf, das der Pointer automatisch initialisiert wird, aber sicher bin ich mir nicht.

            1. Hi,

              Ich initialisiere die Struktur in der gleichen Funktion, in der ich die Struktur mit Daten fülle. Muss ich dann den Pointer nochmal extra initialisieren?

              Du mußt für die Struktur erstmal Speicher allozieren und die dabei erhaltene Speicheradresse Deinem Pointer zuweisen.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              Schreinerei Waechter
              Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Hi,

                Du mußt für die Struktur erstmal Speicher allozieren und die dabei erhaltene Speicheradresse Deinem Pointer zuweisen.

                Ja, langsam versteh ich, wo ich den Denkfehler drin hab. Ich werd mich heute hinsetzen und einiges ändern.

                Danke an alle für die Tips :)

      2. Moin,

        das ist eigentlich alles kein Problem. Leider postest du hier keine Fehlermeldung.

        Fehlermeldung kommt keine, nur ist der Wert in der int main() nicht verfügbar.

        class Device{
        public:
            Device(char* devicelist);
            ~Device();

        int device_number;
        const char* id[];

        struct device_data{
          const char* name;
          const char* description;
          const char* filename;
        } *p_device;

        private:
        ezxml_t DeviceList(char* device_list);
        std::string devices_e;
        char devices_c[];
        };

        Ich vermute mal, dass du die Struktur oder die Instanz der Struktur nicht public gemacht hast.

        Die Struktur ist also Public.

        if(device[device_counter].name = ezxml_attr(attribute_list, "id"));

        Was ist denn device? Das muss eine Variable sein. Ein Mitglied deiner
        Device-Klasse ist es jedenfalls nicht.
        Ich vermute mal:
        Device::device_data device[];
        oder
        Device::device_data* device;
        und dann irgendsowas wie
        device = MyDevice.p_Device;
        wobei MyDevice eine Instanz der Klasse Device ist.

        (Wobei "device_counter" über eine for()-Schleife erhöht wird)
        Jetzt kann ich innerhalb der Klasse auf device[0].name zugreifen.
        Wenn ich allerdings aus der int main() auf diesen Wert zugreifen will:

        Device dev(devicefile);
        cout << dev.device[0].name << endl;

        Kommt die Meldung, das "device" kein Member der Klasse Device ist. Wenn ich per *p_device zugreifen will, klappt es auch nicht.

        s. o. Daraus folgt dann die Fehlermeldung.

        Und, was heißt "klappt es auch nicht"? Fehlermeldung (dann bitte den Inhalt) oder Fehlverhalten (was erwartest du und was passiert) oder was? Kristallkugeln sind zur Zeit ausverkauft und z. B. dev.p_device->name sollte legal sein.

        Insgesammt will ich ein Array in der Klasse erzeugen, auf dessen Werte ich in der main() zugreifen kann. Mit Werten ausserhalb der Struktur klappt es ja auch ;)

        Bisher hatte ich noch nie eine STruktur innerhalb einer Klasse, deshalb ist das ein problem für mich, und ich komm einfach nicht weiter :(