2

私は C++ にかなり慣れていないため、このエラーの原因がわかりません。

/home/---/Documents/C++/---_lab2/lab2c.cpp||In function ‘int main()’:|
Line 9: error: ‘float circle::x1’ is private
Line 58: error: within this context

データ メンバー x1 (x2、y1、y2 も同様) がプライベートであることはわかっていますが、クラス サークルのメンバーである関数を使用してオブジェクト myObj を操作しているので、それらはまだ機能しないのでしょうか? 誰かがここで何が悪いのか説明できますか?

#include <iostream>
#include <cmath>
#define PI 3.14159

using namespace std;

class circle{

private:
float x1,y1,x2,y2;

protected:

float distance(float x1,float y1,float x2, float y2){
    return sqrt(fabs((x2-x1)*(x2-x1))+fabs((y2-y1)*(y2-y1)));
};

public:

float radius(float x1, float y1, float x2, float y2){
    float rad = distance(x1,y1,x2,y2);
    return rad;
};

float circumference(float rad){
    return 2*PI*rad;
};

float area(float rad){
    return PI*rad*rad;
};

float populate_classobj(float x1main,float x2main,float y1main,float y2main){
x1 = x1main;
x2 = x2main;
y1 = y1main;
y2 = y2main;
};

};

int main(){

circle myObj;
float x1main,x2main,y1main,y2main;
cout << "Coordinates of center" << endl;
cout << "X: ";
cin >> x1main;
cout << "Y: ";
cin >> y1main;
cout << "Coordinates of point on circle" << endl;
cout << "X: ";
cin >> x2main;
cout << "Y: ";
cin >> y2main;

myObj.populate_classobj(x1main,x2main,y1main,y2main);

cout << "Radius is " << myObj.radius(myObj.x1,myObj.y1,myObj.x2,myObj.y2) << endl;
cout << "Circumference is " << myObj.circumference(myObj.radius(myObj.x1,myObj.y1,myObj.x2,myObj.y2)) << endl;;
cout << "Area is " << myObj.area(myObj.radius(myObj.x1,myObj.y1,myObj.x2,myObj.y2)) << endl;



return 0;
}
4

3 に答える 3

4

&他のメソッドprivateを呼び出すときに、クラス外のメンバーにアクセスしようとしています。radius

しかし、あなたの本当の問題はロジックにあります。radiusたとえば、クラスのメソッドにパラメータを渡す必要があるのはなぜですか。

float radius(float x1, float y1, float x2, float y2){
    float rad = distance(x1,y1,x2,y2);
    return rad;
};

サークルはすでに自己完結型ですが、それだけではありません。

float radius(){
    float rad = distance(x1,y1,x2,y2);
    return rad;
};

と同じ:

float circumference(){
    return 2*PI*radius();
};

float area(){
    return PI*radius()*radius();
};

また、次の点にも注意してください。

circle myObj;

無効なオブジェクトを作成します。populate_classobj有効にするためだけに電話する必要はありません。代わりに、適切なコンストラクターを用意してください。

circle(float x1main,float x2main,float y1main,float y2main) :
x1(x1main),
x2(x2main),
y1(y1main),
y2(y2main)
{
};

次のようにオブジェクトを作成します。

circle myObj(x1main,x2main,y1main,y2main);
于 2012-09-30T20:08:09.237 に答える
2

maintry to useの末尾にあるさまざまな挿入ステートメントはmyObj.x1、 のメンバーを使用しようとしx1ますmyObjx1プライベートなのでできません。コードがその値で何をしているのかは問題ではありません。プライベートはプライベート。メンバー関数またはフレンド関数の内部から値にアクセスできますが、外部からはアクセスできません。

于 2012-09-30T20:05:52.560 に答える
2
cout << "Radius is " << myObj.radius(myObj.x1,myObj.y1,myObj.x2,myObj.y2) << endl;
cout << "Circumference is " << myObj.circumference(myObj.radius(myObj.x1,myObj.y1,myObj.x2,myObj.y2)) << endl;;
cout << "Area is " << myObj.area(myObj.radius(myObj.x1,myObj.y1,myObj.x2,myObj.y2)) << endl;

プライベート変数にはアクセスできません。また、それを行う必要はありません。メソッド シグネチャは であるmyObj.radius()myObj.area()x1 y1 x2 y2すでに のメンバーである必要がありcircle myObjます。したがって、それらを引数として再度渡すのは冗長です。

于 2012-09-30T20:05:55.680 に答える