2016-03-22 12 views
5

私はC++を初めて使用しているため、エラーを修正する方法がわかりません。ご迷惑をおかけします。 エラーが発生する部分cirArea[]配列に半径を入力しようとしていますが、動作しないようです。ここでメンバ参照の基本タイプ 'double'は構造体または共用体ではありません

は、私のコードの一部です:

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

setRadiusについて():

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

のでここでエラーです:

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

答えて

2

'一定のサイズではない'静的に割り当てられた配列を作成することはできません。 第2の問題はcirAreaCircleタイプではなく、doubleであるということです。

あなたはそれを動的に割り当てる(そして後でそれを削除)し、それCircleタイプにする必要があります:

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

しかし、それを行うための好適な方法は、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

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

とし私はstd :: vectorではなく、ダイナミック配列 –

+1

私は知っている:)私はちょうどこの答えを編集していたが、私はそれをもっと速くすることができませんでした。編集内容を確認してください。 – Patryk

1

あなたcirAreaは、double型をしていませんCircleですので、Circleメソッドに適用することはできません。 cirAreaのタイプをdoubleからCirculeに変更してエラーを修正してください。

それは、本質的に故障します。この文の
1

double cirArea[numCircle];

可変長配列はC++でサポートされていない、と私はあなたが要素ではなくdoubleとしてCircleオブジェクトを使用することを意味だと思います。

を使用して、Circleのオブジェクトのベクトルをモデル化します。

1

cirAreaは、doubleの配列であり、0123ではなく。 double型は、もちろん、Circleのメンバ関数(またはメンバ関数)を持っていません。あなたのコンパイラがvariable-lenght arraysをサポートするように思われるので

私はあなたが本当にあなたが好きstd::vectorを使用する必要があり、ポータブルプログラムを作りたい場合は

Circle cirArea[numCircle]; 

可変長配列は、標準C++の機能ではありませんしたいと仮定します

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

double cirArea[numCircle];doublearrayです。 arrayCircleである必要があります。しかし、numCircleはconstではないので、コンパイラが許可していてもそれを行うことはできません。 dynamically allocated array、さらにはstd::vectorを使用する必要があります。

完全なC++ソリューションは次のようになります。constructor argumentとしてRadiusを受け入れる

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

Circle場合、あなたはそれらの二行置き換えることがあります。それはあるので

cirArea.emplace_back(cirRadius); 
関連する問題