mikrocontroller.net

Forum: PC-Programmierung Alle Member einer struct mit Werten belegen


Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgende struct:
typedef struct
{
   int i;
   int j;
   int k;
} myStruct_t;

Jetzt würde ich gerne den Benutzer meiner Struct zwingen ALLE Member mit 
Werten zu belegen.

So etwas soll also möglich sein:
myStruct_t myStruct = { 1, 2, 3 };
Bei einer Initialisierung a la
myStruct_t myStruct2 = { 1, 2 };
würde ich aber gerne schon zur Compilezeit eine Fehlermeldung bekommen.

Gibt es da bei einem MFC-Projekt eine Möglichkeit?

Danke für jede Antwort und viele Grüße

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Klasse draus machen mit drei protected-Membern, und einen 
Konstruktor mit drei nicht-optionalen int-Parametern?

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke erstmal für die Antwort.
Mein Fehler, da fehlt etwas der Hintergrund...
Das Ganze ist so aufgebaut:
class MyClass
{
   public:
      // configuration structure
      typedef struct
      {
          int i;
          int j;
          int k;
      } ConfMyClass;

      // member functions
      MyClass(const ConfMyClass&);

   private:
      // private Funktionen und member
};
Initialisiert wird dann so:
const MyClass::ConfMyClass confMyClass =
{
   1,
   2,
   3
};
MyClass myClassObj1(confMyClass);
MyClass myClassObj2(confMyClass);

Und jetzt hätte ich eben gerne eine Fehlermeldung, wenn jemand die 3 
nicht angibt...

Hab den Code geerbt und das ist in allen möglichen Klassen (ca. 20) so 
gemacht. Problem daran ist 'nur', dass der Code wenig bis gar nicht 
kommentiert ist und es halt einfach mal passiert, dass man einen 
Parameter vergisst anzugeben. Dem würde ich gerne vorbeugen...

Viele Grüße

Autor: Rogie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pack die Struktur in den private Bereich und greif mit get und set 
Methoden auf die Strukturmember zu.
Dann gestaltest du den Konstruktor wie schon gesagt so, dass alle 3 
Werte übergeben werden müssen.

class MyClass
{
   public:
      // member functions
      MyClass(const ConfMyClass&);
      MyClass(int i, int j, int k)
     {
       ConfMyClass.i = i;
       ///usw.
     }

     int geti(){ return ConfMyClass.i;}
     void seti(int i) {ConfMyClass.i = i;}

   private:
      // private Funktionen und member

      // configuration structure
      typedef struct
      {
          int i;
          int j;
          int k;
      } ConfMyClass;

};

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

class MyClass
{
   public:
      // configuration structure
      typedef struct
      {
        friend class MyClass;

        ConfMyClass( int i_, intj_, int k_ ) : i( i_ ), j( j_ ), k( k_ ) {}

        int i() const { return i; }
        int j() const { return j; }
        int k() const { return k; }

        private:
          int i;
          int j;
          int k;
      } ConfMyClass;

      // member functions
      MyClass(const ConfMyClass&);

   private:
      // private Funktionen und member
};
 

const MyClass::ConfMyClass confMyClass
(
   1,
   2,
   3
);

MyClass myClassObj1(confMyClass);
MyClass myClassObj2(confMyClass);
 

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

na gut, dann hilfts wohl nicht.
Das 'schöne' an der bisherigen Implementierung ist halt, dass man eine 
Konfiguration für mehrere Objekte verwenden kann. Das geht dann mit dem 
Konstruktor nicht mehr - da bräuchte ich dann den Copy-Konstruktor, aber 
das werde ich auch noch überleben.

@Karl-Heinz: Auch ne interessante Variante, werd ich mir mal genauer 
anschauen.

Viele Grüße und danke für die Hilfe

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das 'schöne' an der bisherigen Implementierung ist halt, dass man
> eine Konfiguration für mehrere Objekte verwenden kann. Das geht
> dann mit dem Konstruktor nicht mehr - da bräuchte ich dann den
> Copy-Konstruktor, aber das werde ich auch noch überleben.

Wozu solltest du einen Copy-Konstruktor brauchen?

Autor: Action (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Rolf,

zumindest bei der Variante von Rogie hätte ich bei jedem Objekt alle 
Member von MyClass als Parameter übergeben müssen.
Wenn ich also zwei Objekte mit der gleichen Konfiguration habe müsste 
ich beide mit den gleichen Parameter aufrufen - oder eben das zweite 
Objekt mit Hilfe des Copy-Konstruktors anlegen.
Habe jetzt die Implementierung von Karl-Heinz übernommen, da brauche ich 
den natürlich nicht und kann den Code zumindest annähernd so lassen, wie 
er war (bis auf so 'Kleinigkeiten' wie , statt ; usw.).

Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.