2011-12-31 18 views
14

sto ottenendo questo errore fastidioso e io non so perché = ( Questa è la domanda, ho risolto, ma sto avendo un problema con il costruttoreerrore C2512: non appropriato costruttore di default disponibili

!.

Scrivi un programma che definisce una classe chiamata Circle che include il raggio (tipo double) come membri dati Fornire un set e una funzione get per questo membro dati. Assicurarsi che il valore immesso dall'utente sia valido e corretto (maggiore di zero).
Includi membri funzione: un membro.function che calcola e restituisce Diametro del membro b.function cerchio che calcola e ritorno Circonferenza del cerchio c membro di funzione che calcola e Area di ritorno del cerchio d.funzione membro che Visualizza tutte le informazioni del cerchio e.constructor che inizializza i dati membro. Se il raggio non è valido (vale a dire meno di zero) impostalo su zero.

l'errore che sto affrontando:

errore C2512: 'Circle': nessun costruttore predefinito appropriato disponibile

questo è il mio codice:

#include <iostream> 

    using namespace std; 

    class Circle 
     { 
      public: 

      Circle(double); 
      void setRadius(double); 
      double getRadius(); 
      void Display(); 
      double Diameter(double); 
      double Circumference(double); 
      double Area(double); 

      private: 

      double radius; 

     }; 

     Circle::Circle(double radio) 
      { 
       setRadius(radio); 
      } 

     void Circle::setRadius(double ra) 
      { 
       if (ra < 0) 
       { 
        radius = 0; 
       } 
       else 
        radius = ra; 
      } 

     double Circle::getRadius() 
      { 

       double rado; 

      cout << "Enter the Radius:\n"; 
      cin >> rado; 
      setRadius(rado); 

      return radius; 
      } 

     double Circle::Diameter(double rad) 
      { 
       return 2*rad; 
      } 

     double Circle::Area(double radi) 
      { 
       return 3.14 * radi * radi; 
      } 


     double Circle::Circumference(double radiu) 
      { 
       return 2 * 3.14 * radiu; 
      } 

     void Circle::Display() 
     { 
      cout << "The Radius of the circle is: \n"; 
      cout << radius; 
      cout << "\nThe Diameter of the circle is: \n"; 
      cout << Diameter(radius); 
      cout << "\nThe Circumference of the circle is: \n"; 
      cout << Circumference(radius); 
      cout << "\nThe Area of the circle is: \n"; 
      cout << Area(radius); 
      cout << endl; 
     } 

     int main() 
     { 
      Circle C; 
      C.getRadius(); 
      C.Display(); 

      return 0; 
     } 
+1

Penso che tu abbia frainteso come dovrebbero apparire le funzioni dei membri. Il tuo codice non segue uno stile particolarmente orientato agli oggetti. Per esempio, non posso ottenere l'area del cerchio 'C' chiamando' C.Area() '. Dovresti aggiustarlo. Inoltre, c'è una ragione particolare per cui tutti i tuoi argomenti hanno nomi diversi, anche se pensavano che * tutti * si riferivano al raggio? Non farlo, sii coerente. –

+0

Il costruttore tenta di utilizzare una funzione membro, per questo deve esistere già un oggetto, quindi è necessario che un costruttore abbia terminato prima. Dovresti inizializzare le variabili membro usando un costruttore del loro tipo prima di entrare nel corpo del costruttore. –

risposta

2

Beh, quindi aggiungine uno :)

Circle() : radius(0.0) {} 
5

Un costruttore predefinito è uno senza parametri. Normalmente, è fornito per te. Ma se si definisce esplicitamente qualsiasi altro costruttore, allora non lo è. Quindi devi definirlo da solo o non usarlo. Lo si utilizza quando si crea un oggetto in principale, in questo modo:

Circle C; 

Quindi, o definire un costruttore di default, o non lo si utilizza.

+0

Grazie, ho risolto il problema, ho definito il costruttore senza parametri e tutto ha funzionato bene :)! – user1092492

+3

@ user1092492 Ma è una cattiva soluzione. Pensa: ha senso avere un cerchio senza raggio? No. La tua classe non dovrebbe definire un costruttore predefinito. –

14

Questa linea invoca un costruttore senza argomenti (noto come costruttore di default):

Circle C; 

L'unico costruttore di aver definito è:

Circle(double); 

Speriamo che questo dovrebbe puntare nella direzione giusta .

-1

È necessario definire un costruttore senza parametri chiamato costruttore predefinito. È possibile inizializzare i membri correlati ai valori predefiniti.

Circle::Circle() 
    { 
    radius = 0.0 
    } 
+0

Le variabili dei membri della classe devono essere inizializzate tramite la lista di inizializzazione (come ha fatto il luskan), e non nel corpo del costruttore - a meno che non ci sia un buon motivo per non farlo (non vedo questo motivo qui). Se il raggio era un non POD, potrebbe essere inizializzato DUE VOLTE. – brewmanz

Problemi correlati