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

main尝试使用末尾的各种插入语句myObj.x1,它尝试使用 的x1成员myObj。他们不能,因为x1是私人的。代码对该值做什么并不重要。私人是私人的。您可以从成员函数或友元函数内部访问该值,但不能从外部访问。

于 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 y2circle myObj

于 2012-09-30T20:05:55.680 回答