Problem bei Constructor einer Klasse



  • Hi Forum,

    Mal wieder bracuhe ich eure Hilfe :). Bei folgendem Code:

    #include <iostream>
    class Color {
      public:
        unsigned char R, G, B, A;
        Color(unsigned char prmR, unsigned char prmG, unsigned char prmB, unsigned char prmA)
        : R(prmR), G(prmG), B(prmB), A(prmA) {
        }
    };
    
    int main(int argc, char* argv[]) {
      Color MyColor();
      std::cout << "r: " << (int)MyColor.R << std::endl
                << "g: " << (int)MyColor.G << std::endl
                << "b: " << (int)MyColor.B << std::endl
                << "a: " << (int)MyColor.A << std::endl;
    
      return 0;
    }
    

    bekomme ich die Fehlermeldung:
    error: request for member "R" in "MyColor", which is of non-class type 'Color ()()'
    error: request for member "G" in "MyColor", which is of non-class type 'Color ()()'
    error: request for member "B" in "MyColor", which is of non-class type 'Color ()()'
    error: request for member "A" in "MyColor", which is of non-class type 'Color ()()'

    Warum zur Hölle meint der MyColor wäre von einem Typ der keine Classe ist? Hilft mir da jemand weiter?

    Mfg X4rd3n



  • da du den standart konstruktor benutzt lässt die die klammern bei der erzeugung weg

    Color MyColor;
    

    reicht

    und du solltest die werte wenigstens initialisieren
    wenn du schon nicht den konstruktor aufrufst den du da geschrieben hast dann machd as wenigstens per default werte

    class Color {
    public:
       unsigned char A, B, C, D;
       Color(unsigned char prmR = 0, unsigned char prmG = 0, unsigned char prmB = 0, unsigned char prmA = 0)
        : R(prmR), G(prmG), B(prmB), A(prmA) 
        { }
    };
    

    so sollte das dann klappen



  • Normalerweise sidn die auch initialisiert :). Hab die Funktionsdeklaration nur in einer Headerdatei stehen und hab jetzt versucht den Code soweit zu verkürzen wie es geht und dabei die Default-Angaben aus der Headerdatei vergessen. Naja auf jedenfall mal Danke, ohne Klammern am Ende gehts.


  • Administrator

    x4rd3n schrieb:

    Naja auf jedenfall mal Danke, ohne Klammern am Ende gehts.

    Vielleicht noch zur Erklärung wieso:

    Color MyColor(); // Das ist eine Funktionsdeklaration!
    Color MyColor; // Defaultkonstruktor Aufruf
    Color MyColor = Color(); // Ebenfalls Defaultkonstrutor
    

    Grüssli



  • Weisst du auch warum? 😉

    Color MyColor(); wird nicht als Instanziierung, sondern als Funktionsdeklaration angesehen. Wie sollte man sonst eine Funktion mit 0 Parametern und dem Rückgabetypen Color deklarieren können?

    Ach ja, benutz bitte anstatt der C-Casts mit Klammern das C++-Mittel static_cast .


Anmelden zum Antworten