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


von Ampfing (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgende struct:
1
typedef struct
2
{
3
   int i;
4
   int j;
5
   int k;
6
} 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:
1
myStruct_t myStruct = { 1, 2, 3 };
Bei einer Initialisierung a la
1
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

von der mechatroniker (Gast)


Lesenswert?

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

von Ampfing (Gast)


Lesenswert?

Hi,

danke erstmal für die Antwort.
Mein Fehler, da fehlt etwas der Hintergrund...
Das Ganze ist so aufgebaut:
1
class MyClass
2
{
3
   public:
4
      // configuration structure
5
      typedef struct
6
      {
7
          int i;
8
          int j;
9
          int k;
10
      } ConfMyClass;
11
12
      // member functions
13
      MyClass(const ConfMyClass&);
14
15
   private:
16
      // private Funktionen und member
17
};
Initialisiert wird dann so:
1
const MyClass::ConfMyClass confMyClass =
2
{
3
   1,
4
   2,
5
   3
6
};
7
MyClass myClassObj1(confMyClass);
8
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

von Rogie (Gast)


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;

};

von Karl H. (kbuchegg)


Lesenswert?

1
class MyClass
2
{
3
   public:
4
      // configuration structure
5
      typedef struct
6
      {
7
        friend class MyClass;
8
9
        ConfMyClass( int i_, intj_, int k_ ) : i( i_ ), j( j_ ), k( k_ ) {}
10
11
        int i() const { return i; }
12
        int j() const { return j; }
13
        int k() const { return k; }
14
15
        private:
16
          int i;
17
          int j;
18
          int k;
19
      } ConfMyClass;
20
21
      // member functions
22
      MyClass(const ConfMyClass&);
23
24
   private:
25
      // private Funktionen und member
26
};
27
 
28
29
const MyClass::ConfMyClass confMyClass
30
(
31
   1,
32
   2,
33
   3
34
);
35
36
MyClass myClassObj1(confMyClass);
37
MyClass myClassObj2(confMyClass);

von Ampfing (Gast)


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

von Rolf Magnus (Gast)


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?

von Action (Gast)


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ß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.