2016-03-22 24 views
5

Tôi mới sử dụng C++ và không thể tìm ra cách sửa lỗi, sẽ đánh giá cao sự giúp đỡ của bạn Phần xảy ra lỗi cố gắng nhập bán kính vào mảng cirArea[], nhưng nó dường như không hoạt động.Loại cơ sở tham chiếu thành viên 'double' không phải là cấu trúc hoặc công đoàn

Dưới đây là một phần của mã của tôi:

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

Đối setRadius():

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

vì vậy đây là LỖI:

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

Trả lời

2

Bạn không thể tạo mảng được phân bổ tĩnh với 'không phải là kích thước cố định'. Vấn đề thứ hai là cirArea không thuộc loại Circle nhưng thuộc số double.

Bạn sẽ phải phân bổ nó tự động (và xóa nó sau đó) và làm cho nó Circle loại:

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

Nhưng một cách thích hợp để làm việc đó sẽ được sử dụng một 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

Vì nó là C++ được gắn thẻ Tôi sẽ đi với std :: vector chứ không phải mảng động –

+1

Tôi biết :) Tôi chỉ đang chỉnh sửa câu trả lời này nhưng tôi không thể làm điều đó nhanh hơn. Vui lòng kiểm tra chỉnh sửa của tôi - điều đó sẽ ổn. – Patryk

1

bạn cirArea có một loại đôi, không Circle, vì vậy bạn không thể áp dụng phương thức này Circle. Thay đổi loại cirArea từ double thành Circule để sửa lỗi.

1

Đó là về cơ bản tuyên bố này đó là có lỗi:

double cirArea[numCircle];

mảng chiều dài biến không được hỗ trợ trong C++, và tôi nghĩ rằng bạn có nghĩa là sử dụng một đối tượng Circle là yếu tố chứ không phải là một double.

Sử dụng std::vector<Circle> để thay thế mô hình vectơ của Circle đối tượng.

1

Vấn đề là cirArea là một mảng double và không phải là Circle. Tất nhiên, loại double không có Circle chức năng thành viên (hoặc bất kỳ chức năng thành viên nào).

Kể từ khi trình biên dịch của bạn dường như hỗ trợ variable-lenght arrays Tôi cho rằng bạn thực sự muốn

Circle cirArea[numCircle]; 

mảng Variable-length không phải là C++ tính năng tiêu chuẩn, nếu bạn muốn thực hiện chương trình di động, bạn nên sử dụng std::vector như

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

double cirArea[numCircle]; là một array của double. Nó phải là array của Circle.Tuy nhiên, numCircle là một không-const, do đó bạn không thể làm điều đó (ngay cả khi trình biên dịch cho phép nó. Nó không phải là standared). Bạn nên sử dụng dynamically allocated array hoặc thậm chí tốt hơn là std::vector.

Một C++ hoàn chỉnh giải pháp sẽ là:

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

nếu Circle chấp nhận Radius như constructor argument, bạn có thể thay thế những hai dòng:

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

với:

cirArea.emplace_back(cirRadius); 
Các vấn đề liên quan