"クラス::データメンバーはプライベート"エラーですが、私はメンバー関数でそれを操作していますか?

StackOverflow https://stackoverflow.com//questions/12664615

質問

私は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;
}
.

役に立ちましたか?

解決

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

他のヒント

mainの最後の様々な挿入ステートメントは、myObj.x1のメンバーx1を使用しようとします。myObjがプライベートなので、彼らはできません。コードがその値で何をしているのかは関係ありません。プライベートはプライベートです。あなたは内部メンバー関数または友達関数からの値にアクセスできますが、外部からではありません。

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である必要があります。それで、引数が冗長であるのでそれらを再び渡します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top