Я довольно новичок в 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
, Они не могут, потому что 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
, Поэтому повторная передача их в качестве аргументов является излишней.