Question

Je suis relativement nouveau en C++ et je ne comprends pas ce qui déclenche cette erreur :

/home/---/Documents/C++/---_lab2/lab2c.cpp||In function ‘int main()’:|
Line 9: error: ‘float circle::x1’ is private
Line 58: error: within this context

Je sais que le membre de données x1 (x2, y1, y2 également) est privé, mais j'opère sur l'objet myObj en utilisant des fonctions qui sont membres du cercle de classes, alors ne devraient-elles pas toujours fonctionner ?Quelqu'un peut-il m'expliquer ce qui ne va pas ici ?

#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;
}
Était-ce utile?

La solution

Vous essayez d'accéder private les membres en dehors de la classe lorsque vous appelez radius & Autres méthodes.

Mais votre vrai problème est avec la logique.Pourquoi devez-vous transmettre des paramètres, par exemple, au radius méthode de votre classe :

float radius(float x1, float y1, float x2, float y2){
    float rad = distance(x1,y1,x2,y2);
    return rad;
};

Le cercle est déjà autonome, pourquoi ne pas simplement :

float radius(){
    float rad = distance(x1,y1,x2,y2);
    return rad;
};

Même avec:

float circumference(){
    return 2*PI*radius();
};

float area(){
    return PI*radius()*radius();
};

Notez également que :

circle myObj;

crée un objet invalide.Tu ne devrais pas avoir à appeler populate_classobj juste pour le rendre valide.Au lieu de cela, ayez un constructeur approprié :

circle(float x1main,float x2main,float y1main,float y2main) :
x1(x1main),
x2(x2main),
y1(y1main),
y2(y2main)
{
};

et créez l'objet comme :

circle myObj(x1main,x2main,y1main,y2main);

Autres conseils

Les différentes instructions d'insertion à la fin de main Essayez d'utiliser myObj.x1, qui essaie d'utiliser le membre x1 de myObj.Ils ne peuvent pas, parce que x1 est privé.Peu importe ce que le code fait avec cette valeur ;privé est privé.Vous pouvez accéder à la valeur à partir de à l'intérieur une fonction membre ou une fonction ami, mais pas de l'extérieur.

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;

Vous ne pouvez pas accéder à une variable privée.De plus, vous ne devriez pas avoir à faire ça.La signature de votre méthode doit être myObj.radius() ou myObj.area() comme x1 y1 x2 y2 sont déjà membres du circle myObj.Il est donc redondant de les passer à nouveau comme arguments.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top