“class::data member is private”错误,但我用成员函数对其进行操作?
-
11-12-2019 - |
题
我对 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)是私有的,但我正在使用类 Circle 成员的函数对对象 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
. 。他们不能,因为 x1
是私人的。代码如何处理该值并不重要;重要的是。私人就是私人。您可以从以下位置访问该值 里面 成员函数或友元函数,但不是来自外部。
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
. 。因此再次将它们作为参数传递是多余的。
不隶属于 StackOverflow