Zugriff auf struct in einer Klasse



  • Hallo,
    in einer meiner Klassen habe ich eine struct-Membervariable deklariert und möchte darauf im Konstruktor zugreifen, aber anscheinend mach ich da was falsch. Der Compiler spuckt folgenden Fehler aus:
    error C2059: syntax error : '.'

    Der Code dazu:

    //Wave.h
    
    class Wave
    {
    private:
    	//members	
    
    	struct Epic_coord
    	{
    		double X;
    		double Y;
    	} epicenter;
    
            //...
    
    public:
    	Wave (double x_init, double y_init, int intens_init);
    	~Wave () {};
    };
    
    //Wave.cpp
    
    #include "Wave.h"
    
    Wave::Wave (double x_init, double y_init, int intens_init): 
    	epicenter.X(x_init), epicenter.Y(y_init), intensity(intens_init) //<-- diese Zeile
    {
            //...
    }
    


  • Die initialisierungsliste kannst du nur für übergabe von werten an konstruktoren und direkt initialisuerng von primitiven typen in der eigenen klasse/struct verwenden, aber nicht für member einer struct die ein member deiner klasse ist.
    Nimm die zuweiseungen zur struct aus der liste raus und führe sie im konstruktor-rumpf durch, oder gib deiner struct einen konstruktor und rufe diesen in der initialisierungsliste auf.



  • In einer Initialisierungsliste kannst du nur Member der eigenen Klasse initialisieren. Deine Klasse hat genau 1 Member, nämlich epicenter.

    Wave::Wave (double x_init, double y_init, int intens_init) :
        epicenter() // ruft Default-Constructor auf
    {
    }
    

    Das, das du vorhast, geht dann eher so:

    class Wave
    {
    private:
        struct Epic_coord
        {
            Epic_coord(double x_init, double y_init) : X(x_init), Y(y_init) {}
            double X;
            double Y;
        } epicenter;
    
    public:
        Wave (double x_init, double y_init, int intens_init);
        ~Wave () {};
    };
    
    Wave::Wave (double x_init, double y_init, int intens_init) :
        epicenter(x_init, y_init) // ,intensity(intens_init)
    {
    
    }
    

    Obwohl ich das Design komisch finde.



  • Danke. Hat diese Einschränkung einen bestimmten Grund?

    Edit: Ich werde wahrscheinlich dann sie per Zuweisung im Konstruktor der Klasse initialisieren. Bei zwei Attributen kann man struct noch weglassen, schöner ist es aber mit.



  • [Rewind] schrieb:

    Hat diese Einschränkung einen bestimmten Grund?

    Es könnte gar nicht so funktionieren, wie du das vorhast. Wie willst du den Attributen eines Objekts etwas zuweisen, wenn das Objekt noch gar nicht existiert. Du musst doch erst ein Objekt erzeugen, bevor du die Attribute anpacken kannst.

    Wave::Wave (double x_init, double y_init, int intens_init):
        epicenter.X(x_init), epicenter.Y(y_init), intensity(intens_init) // epicenter.X, aber epicenter gibts doch noch gar nicht...
    {
            //...
    }
    

  • Mod

    [Rewind] schrieb:

    Danke. Hat diese Einschränkung einen bestimmten Grund?

    Ja. Weil deine Klasse ein Element von meiner Klasse hat, lässt meine Klasse dich noch lange nicht in ihre Initialisierung reinpfuschen.



  • @Gugelmoser: epicenter ist bereits ein erzeugtes Objekt. Siehe Zeile 12 im ersten Beitrag.

    @SeppJ: Warum denn nicht? Deine Elemente sind ja public.



  • [Rewind] schrieb:

    @Gugelmoser: epicenter ist bereits ein erzeugtes Objekt. Siehe Zeile 12 im ersten Beitrag.

    Nö das ist keine Definition, ist ne Deklaration. Speicher wird erst allokiert, wenn du ein Objekt dieser Klasse erzeugst.

    edit: zumindest habe ich es so gelernt, lass mich aber gerne aufklären. 🙂

    edit2: Ich habe etwas von krümelkacker gefunden. Hoffe, er hat nichts dagegen.

    krümelkacker schrieb:

    So werden die Begriffe Deklaration und Definition im offiziellen C++ Standard benutzt:

    class foo;          // <-- Deklaration von foo
    
    class foo {         // <-- Definition  von foo
    public:
      int x;            // <-- Definition  von foo::x
      static int y;     // <-- Deklaration von foo::y
      void blah();      // <-- Deklaration von foo::blah
      int get() const { // <-- Definition  von foo::get als inline-Funktion
        return x;
      }
    };
    

    Für mich ist eine Definition immer einhergehend mit einer Speicherallokation. Wieso der Standard int x als Definition bezeichnet, verstehe ich nicht.



  • Ich verstehe nicht ganz, worauf du hinaus willst. Mein struct ist definiert, Objekt erzeugt und Deklaration ist in dem Fall nicht erforderlich.

    Edit: So, wie ich das hingeschrieben habe (epicenter.X), kann man's verwenden.



  • [Rewind] schrieb:

    Ich verstehe nicht ganz, worauf du hinaus willst. Mein struct ist definiert, Objekt erzeugt und Deklaration ist in dem Fall nicht erforderlich.

    Ja deine struct ist definiert. epicenter ist aber ein Attribut der Klasse Wave und hat eine Objektzugehörigkeit, d.h. für das Attribut wird nur Speicher allokiert wenn du ein Wave-Objekt erstellst. Außerdem beinhaltet jede Definition eine Deklaration. Naja egal, ist ja eh Off-Topic 😃


Anmelden zum Antworten