Ошибка «class::datamember is Private», но я работаю с ней с помощью функции-члена?

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.Они не могут, потому что 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().Так что передача их снова, так как аргументы являются избыточными.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top