2016-03-22 6 views
5

Sono nuovo al C++ e non riesco a capire come risolvere l'errore, apprezzerei molto il tuo aiuto La parte in cui si verifica l'errore cercando di inserire il raggio nell'array cirArea[], ma non sembra funzionare.Il tipo di base di riferimento "double" non è una struttura o unione

Ecco una parte del mio codice:

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); 
    } 
} 

Per setRadius():

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

quindi ecco l'errore:

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

risposta

2

Non è possibile creare una matrice allocata in modo statico con "non una dimensione costante". Il secondo problema è che cirArea non è del tipo Circle ma di double.

Si dovrà allocare in modo dinamico (e cancellarlo dopo) e renderlo Circle Tipo:

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; 
} 

Ma un modo preferibile di farlo sarebbe quello di utilizzare un 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

Dal momento che è C++ taggato andrei con std :: vector piuttosto che array dinamici –

+1

Lo so :) Stavo semplicemente modificando questa risposta ma non potevo farlo più velocemente. Per favore controlla le mie modifiche - dovrebbe andare bene. – Patryk

1

tuo cirArea ha un tipo double, non Circle, quindi non è possibile applicare il metodo Circle. Modificare il tipo di cirArea da double a Circule per correggere l'errore.

1

E 'essenzialmente questa dichiarazione che è in difetto:

double cirArea[numCircle];

array di lunghezza variabile non sono supportati in C++, e penso che si intende utilizzare un oggetto Circle come elemento piuttosto che un double.

Utilizzare un std::vector<Circle> per modellare un vettore di oggetti Circle.

1

Il problema è che cirArea è un array di double e non di Circle. Il tipo double ovviamente non ha funzioni membro Circle (o nessuna funzione membro).

Dal momento che il compilatore sembra sostenere variable-lenght arrays suppongo che si vuole veramente

Circle cirArea[numCircle]; 

array di lunghezza variabile non sono una caratteristica standard C++, se si vuole fare il programma portatile si dovrebbe usare std::vector come

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

double cirArea[numCircle]; è un array di double. Dovrebbe essere un array di Circle.Tuttavia, numCircle è un non-const, quindi non è possibile farlo (anche se il compilatore lo consente. Non è standard). Dovresti usare dynamically allocated array o anche meglio un std::vector.

Una completa C soluzione ++ potrebbe essere:

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); 
    } 
} 

se Circle accettare Radius come constructor argument, si può sostituire quelle due righe:

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

con:

cirArea.emplace_back(cirRadius); 
Problemi correlati