377 Stimmen

Initialisierung von C++-Strukturen

Ist es möglich, Structs in C++ wie unten angegeben zu initialisieren:

struct address {
    int street_no;
    char *street_name;
    char *city;
    char *prov;
    char *postal_code;
};

address temp_address = { .city = "Hamilton", .prov = "Ontario" };

Die Links aquí y aquí erwähnen, dass es nur in C möglich ist, diesen Stil zu verwenden. Wenn ja, warum ist dies in C++ nicht möglich? Gibt es einen technischen Grund, warum es nicht in C++ implementiert ist, oder ist es schlechte Praxis, diesen Stil zu verwenden. Ich verwende diese Art der Initialisierung gerne, weil meine Struktur groß ist und dieser Stil mir eine klare Lesbarkeit gibt, welcher Wert welchem Element zugewiesen ist.

Bitte teilen Sie mir mit, ob es andere Möglichkeiten gibt, die gleiche Lesbarkeit zu erreichen.

Ich habe die folgenden Links gelesen, bevor ich diese Frage gestellt habe:

  1. C/C++ für AIX
  2. C Strukturinitialisierung mit Variable
  3. Statische Strukturinitialisierung mit Tags in C++
  4. C++11 Richtige Strukturinitialisierung

13voto

Fabian Punkte 301

Ich weiß, diese Frage ist ziemlich alt, aber ich fand einen anderen Weg der Initialisierung, mit constexpr und currying:

struct mp_struct_t {
    public:
        constexpr mp_struct_t(int member1) : mp_struct_t(member1, 0, 0) {}
        constexpr mp_struct_t(int member1, int member2, int member3) : member1(member1), member2(member2), member3(member3) {}
        constexpr mp_struct_t another_member(int member) { return {member1, member, member3}; }
        constexpr mp_struct_t yet_another_one(int member) { return {member1, member2, member}; }

    int member1, member2, member3;
};

static mp_struct_t a_struct = mp_struct_t{1}
                           .another_member(2)
                           .yet_another_one(3);

Diese Methode funktioniert auch für globale statische Variablen und sogar für constexpr-Variablen. Der einzige Nachteil ist die schlechte Wartbarkeit: Jedes Mal, wenn ein anderes Mitglied mit dieser Methode initialisierbar gemacht werden muss, müssen alle Methoden zur Initialisierung der Mitglieder geändert werden.

10voto

nikc Punkte 2448

Sie können einfach über einen Konstruktor initialisieren:

struct address {
  address() : city("Hamilton"), prov("Ontario") {}
  int street_no;
  char *street_name;
  char *city;
  char *prov;
  char *postal_code;
};

10voto

run_the_race Punkte 2073

Vielleicht übersehe ich hier etwas, aber warum nicht?

#include <cstdio>    
struct Group {
    int x;
    int y;
    const char* s;
};

int main() 
{  
  Group group {
    .x = 1, 
    .y = 2, 
    .s = "Hello it works"
  };
  printf("%d, %d, %s", group.x, group.y, group.s);
}

7voto

user396672 Punkte 3066

Sie können die Lösung von Gui13 sogar in eine einzige Initialisierungsanweisung packen:

struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };

address ta = (ta = address(), ta.city = "Hamilton", ta.prov = "Ontario", ta);

Haftungsausschluss: Ich empfehle diesen Stil nicht

5voto

Puppy Punkte 141483

Sie ist nicht in C++ implementiert. (auch, char* Saiten? Ich hoffe nicht).

Wenn man so viele Parameter hat, ist das in der Regel ein ziemlich ernster Codegeruch. Aber warum nicht stattdessen einfach die Struktur wertinitialisieren und dann jedes Mitglied zuweisen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X