& quot; class :: data является частным & quot; ошибка, но я работаю над этим с функцией-членом?

Я довольно новичок в 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;
}

2

Решение

Вы пытаетесь получить доступ 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);
3

Другие решения

Различные операторы вставки в конце main попробуй использовать myObj.x1, который пытается использовать член x1 из myObj, Они не могут, потому что x1 это личное. Неважно, что код делает с этим значением; личное это личное. Вы можете получить доступ к значению из внутри функция-член или функция-друг, но не снаружи.

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

2