2016-03-22 12 views
5

Jestem nowicjuszem w C++ i nie mogę wymyślić, jak naprawić błąd, byłbym bardzo wdzięczny za pomoc Część, w której wystąpił błąd Jestem próbuje wprowadzić promień do tablicy cirArea[], ale wydaje się, że nie działa.Podstawowy typ bazy danych 'double' nie jest strukturą lub związkiem

Oto część mojego kodu:

int main(){ 
    Circle *area; 
    double cirRadius; 
    int numCircle; 

    cout << "How many circles?" << endl; 
    cin >> numCircle; 
    double cirArea[numCircle]; 

    for (int i = 0; i < numCircle; i++){ 
     cout << "Enter the radius: "; 
     cin >> cirRadius; 
     cirArea[i].setRadius(cirRadius); 
    } 
} 

Dla setRadius():

void Circle::setRadius(double r){ 
    if (r >= 0) 
     radius = r; 
    else { 
     cout << "Invalid radius\n"; 
     exit(EXIT_FAILURE); 
    } 
} 

tak oto błąd:

member reference base type 'double' is not a structure or union 
      cirArea[i].setRadius(cirRadius); 
      ~~~~~~~~~~^~~~~~~~~~ 

Odpowiedz

2

Nie można utworzyć statycznie przydzielonej tablicy o "nie stałym rozmiarze". Po drugie, numer cirArea nie jest typu Circle, ale double.

Trzeba by przeznaczyć go dynamicznie (i usunąć go później) i sprawiają, że Circle typ:

int main(){ 
    double cirRadius; 
    int numCircle; 

    cout << "How many circles?" << endl; 
    cin >> numCircle; 
    Circle *area = new Circle[numCircle]; 

    for (int i = 0; i < numCircle; i++){ 
     cout << "Enter the radius: "; 
     cin >> cirRadius; 
     cirArea[i].setRadius(cirRadius); 
    } 

    delete[] area; 
} 

ale bardziej odpowiedni sposób robienia byłoby użyć std::vector

#include <iostream> 
#include <cstdlib> 
#include <vector> 

struct Circle 
{ 
    double radius; 

    void setRadius(double r){ 
     if (r >= 0) 
      radius = r; 
     else { 
      std::cout << "Invalid radius\n"; 
      exit(EXIT_FAILURE); 
     } 
    }  
} ; 

int main(){ 
    double cirRadius; 
    int numCircle; 

    std::cout << "How many circles?\n"; 
    std::cin >> numCircle; 
    std::vector<Circle> area; 
    area.reserve(numCircle); 

    for (int i = 0; i < numCircle; ++i){ 
     std::cout << "Enter the radius: "; 
     std::cin >> cirRadius; 
     area.emplace_back(); 
     area.back().setRadius(cirRadius); 
    } 

    for(Circle& i : area) 
    { 
     std::cout << i.radius << '\n'; 
    } 
} 

http://cpp.sh/3l7ti

+0

Ponieważ jest Oznaczone C++ Chciałbym użyć raczej std :: vector niż dynamicznych tablic –

+1

Wiem :) Właśnie redagowałem tę odpowiedź, ale nie mogłem tego zrobić szybciej. Sprawdź moje zmiany - to powinno być w porządku. – Patryk

1

Twój cirArea ma typ double, nie Circle, więc nie możesz zastosować na nim metody Circle. Zmień typ cirArea z double na Circule, aby naprawić błąd.

1

To zasadniczo to stwierdzenie, że co winy:

double cirArea[numCircle];

Variable tablice długości nie są obsługiwane w języku C++ i myślę, że masz na myśli, aby użyć Circle obiektu jako elementu raczej niż double.

Zamiast tego należy użyć modelu std::vector<Circle> do modelowania wektorów obiektów Circle.

1

Problem polega na tym, że cirArea jest tablicą double, a nie Circle. Typ double nie ma oczywiście funkcji składowych Circle (lub dowolnego elementu w ogóle).

Ponieważ kompilator wydaje się wspierać variable-lenght arrays Przypuszczam naprawdę chcesz

Circle cirArea[numCircle]; 

zmiennej długości tablice nie są standardową funkcją C++, jeśli chcesz, aby program przenośny należy użyć std::vector jak

std::vector<Circle> cirArea(numCircle); 
0

double cirArea[numCircle]; jest array od double. Powinien to być array z Circle.Jednakże, numCircle nie jest const, więc nie możesz tego zrobić (nawet jeśli pozwala na to kompilator). Powinieneś użyć dynamically allocated array lub jeszcze lepiej std::vector.

Kompletny C roztwór ++ byłoby:

int main(){ 
    Circle *area; 
    double cirRadius; 
    int numCircle; 

    cout << "How many circles?" << endl; 
    cin >> numCircle; 
    std::vector<Circle> cirArea; 
    cirArea.reserve(numCircle); 

    for (int i = 0; i < numCircle; i++){ 
     cout << "Enter the radius: "; 
     cin >> cirRadius; 
     cirArea.emplace_back(); 
     cirArea.back().setRadius(cirRadius); 
    } 
} 

jeśli Circle zaakceptować Radius jako constructor argument, można wymienić te dwie linie:

cirArea.emplace_back(); 
cirArea.back().setRadius(cirRadius); 

z:

cirArea.emplace_back(cirRadius); 
Powiązane problemy