2011-12-31 16 views
14

Dostaję ten przykry błąd i nie wiem dlaczego = ( To jest pytanie, mam rozwiązać go, ale mam problem z konstruktoraerror C2512: brak stosownych dostępny konstruktor domyślny

!.

Napisz program, który definiuje klasę o nazwie Kółko, która zawiera promień (typ podwójny) jako elementy danych.Przyprowadź zestaw i funkcję Pobierz dla tego elementu danych. Sprawdź, czy wprowadzona przez użytkownika wartość jest poprawna i poprawna (większa wartość: (większa niż zero)
Zawierają elementy funkcji: a.function member, który oblicza i zwraca średnicę okręgu b.function member, który jest obliczany i return Obwód okręgu c.function element, który jest obliczany i return Obszar elementu d.fokręgu, który wyświetla wszystkie informacje o kręgu e.constructor, który inicjuje element danych. Jeśli promień jest nieważny (to jest mniej niż zero) ustaw go na zero.

błąd Jestem stoi:

błędu C2512: 'Krąg': brak odpowiedniego konstruktora domyślnego dostępne

to mój kod:

#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

Myślę, że źle zrozumiałeś, jak powinny wyglądać funkcje członka. Twój kod nie jest zgodny ze stylem obiektowym. Na przykład, nie mogę uzyskać obszaru okręgu "C", wywołując 'C.Area()'. Powinieneś to naprawić. Czy istnieje jakiś szczególny powód, dla którego wszystkie twoje argumenty mają różne nazwy, nawet myślę, że * wszystkie * odnoszą się do promienia? Nie rób tego, bądź konsekwentny. –

+0

Twój konstruktor próbuje użyć funkcji składowej, ponieważ musi już istnieć obiekt, więc konstruktor musi wcześniej zakończyć. Powinieneś zainicjować zmienne składowe używając konstruktora swojego typu przed wejściem do treści konstruktora. –

Odpowiedz

2

Cóż, następnie dodaj jedną :)

Circle() : radius(0.0) {} 
5

Domyślnym konstruktorem jest jeden bez żadnych parametrów. Zwykle jest on dla ciebie. Ale jeśli jawnie zdefiniujesz dowolny inny konstruktor, to tak nie jest. Musisz więc zdefiniować to sam, lub nie używać go. Używasz go podczas tworzenia obiektu w głównym, tak:

Circle C; 

Więc, albo zdefiniować konstruktor domyślny, lub nie należy go używać.

+0

Dzięki, że rozwiązałem problem, zdefiniowałem konstruktora bez parametrów i wszystko działało dobrze :)! – user1092492

+3

@ user1092492 Ale to złe rozwiązanie. Pomyśl: czy ma sens mieć okrąg bez promienia? Nie. Twoja klasa nie powinna definiować domyślnego konstruktora. –

14

Linia ta wywołuje konstruktor bez argumentów (znany jako domyślnego konstruktora):

Circle C; 

Jedynym konstruktor zdefiniowaniu jest:

Circle(double); 

Mam nadzieję, że to powinien wskazać we właściwym kierunku .

-1

Należy zdefiniować konstruktor bez parametrów nazywanych domyślnym konstruktorem. Możesz zainicjować powiązane elementy z wartościami domyślnymi.

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

Zmienne należące do klasy powinny zostać zainicjowane za pomocą listy inicjalizacyjnej (jak zrobiła luskan), a nie w ciele konstruktora - chyba że istnieje ku temu dobry powód (nie widzę takiego powodu tutaj). Jeśli promień był nie-POD, może zostać zainicjowany DWUKROTNIE. – brewmanz

Powiązane problemy