2017-05-14 4 views
0

Hallo gnadenlose Gemeinschaft, ich zähle auf Ihre Hilfe heute.C++ Union/Struct 'printColorPicker :: printColorPicker (void)': versucht, eine gelöschte Funktion zu referenzieren

Bitte den Code des Noob siehe

Der Fehler in Zeile 20 (Ich werde es einen Kommentar, damit Sie sehen).

Fehler: 'printColorPicker :: printColorPicker (void)': Der Versuch, eine gelöschte Funktion

#include <iostream> 

    using namespace std; 

    enum availableColors { 
     incolorPrint, 
     colorPrint 
    }; 

    union printColorPicker { 
     struct incolorPrint { 
      int id; 
      char* details = "No color ink eh?"; 
     } i; 

     struct colorPrint{ 
      int id; 
      char* details = "Unicorn mode on"; 
     } c; 
    } color; //line 20 


    void colorPicker(availableColors c){ 
     char* option; 

     switch (c) { 
     case incolorPrint: { 
      option = color.i.details; 
     } 
     break; 

     case colorPrint: { 
      option = color.c.details; 
     } 
     break; 
     } 


     cout << option; 
    } 



    void main(){  
     colorPicker(colorPrint); 
    } 

zu verweisen, was ich versuche die Farbauswahl Methode zu tun zu verwenden ist Echo/cout/printf die Zeichenfolge innerhalb die Strukturen (colorPrint, incolorPrint) innerhalb der printColorPicker Union.

Ich bekomme den oben genannten Fehler.

+0

Also sollte der Konstruktor den Namen der "Union" haben, ohne Argumente? –

+0

TBH Ich verstehe nicht, warum verwenden Sie überhaupt eine "Union" in Ihrem Code. –

+0

Es ist eine Hausaufgabe, eine Gewerkschaft ist eine der Anforderungen. –

Antwort

0

Ich bin nicht sehr versiert in Verrücktheit, aber was wahrscheinlich passiert ist, wenn Sie einen Standardwert für details bieten Sie tatsächlich einen Standardkonstruktor. Wenn das passiert, ist die struct nicht mehr ein Aggregat-Typ, auch bekannt als ein POD. Diese Nicht-Aggregations-Eigenschaft wird weitergegeben, und die Vereinigung ist auch nicht mehr ein Aggregat-Typ, der dann den gelöschten Standard-Konstruktor für die Konstruktion aufruft. (Aggregatentypen rufen den Konstruktor nicht auf Konstruktion auf und verhalten sich nicht genau wie ein C-Objekt.)

EDIT erfordert nur, dass seine Mitglieder trivial konstruierbar sind. Wenn Sie einen Standardwert angeben, ist struct nicht länger trivial konstruierbar. Der Unterschied zu den Aggregattypen ist private/protected Mitglieder sind erlaubt.

Um dies zu beheben, entfernen Sie die Standardwerte für details und weisen sie nach der Konstruktion zu, möglicherweise durch eine Factory-Funktion.

BTW Einstellung von Standardwerten für verschiedene Objekte von union macht keinen Sinn, welcher sollte der Wert sein?

Verwandte Themen