Fehler "Klasse :: Datenmitglied ist privat", aber ich arbeite daran mit einer Mitgliedsfunktion?
-
11-12-2019 - |
Frage
Ich bin ziemlich neu in C ++ und verstehe nicht, was diesen Fehler auslöst:
/home/---/Documents/C++/---_lab2/lab2c.cpp||In function ‘int main()’:|
Line 9: error: ‘float circle::x1’ is private
Line 58: error: within this context
Ich weiß, dass das Datenelement x1 (auch x2, y1, y2) privat ist, aber ich bearbeite das Objekt myObj mit Funktionen, die Mitglieder des Klassenkreises sind. Sollten sie also nicht noch funktionieren?Kann mir jemand erklären, was hier los ist?
#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;
}
Lösung
Sie versuchen, darauf zuzugreifen private
mitglieder außerhalb der Klasse, wenn Sie anrufen radius
& andere Methoden.
Aber ihr eigentliches Problem liegt in der Logik.Warum müssen Sie Parameter übergeben, zum Beispiel an die radius
methode Ihrer Klasse:
float radius(float x1, float y1, float x2, float y2){
float rad = distance(x1,y1,x2,y2);
return rad;
};
Der Kreis ist schon in sich geschlossen, warum nicht einfach:
float radius(){
float rad = distance(x1,y1,x2,y2);
return rad;
};
Gleiches mit:
float circumference(){
return 2*PI*radius();
};
float area(){
return PI*radius()*radius();
};
Beachten Sie auch, dass:
circle myObj;
erstellt ein ungültiges Objekt.Du solltest nicht anrufen müssen populate_classobj
nur um es gültig zu machen.Haben Sie stattdessen einen richtigen Konstruktor:
circle(float x1main,float x2main,float y1main,float y2main) :
x1(x1main),
x2(x2main),
y1(y1main),
y2(y2main)
{
};
und erstelle das Objekt als:
circle myObj(x1main,x2main,y1main,y2main);
Andere Tipps
Die verschiedenen Einfügeanweisungen am Ende von main
versuchen Sie zu verwenden myObj.x1
, der versucht, das Mitglied zu benutzen x1
von myObj
.Sie können nicht, weil x1
ist privat.Es spielt keine Rolle, was der Code mit diesem Wert macht;privat ist privat.Sie können auf den Wert von zugreifen inneren eine Mitgliederfunktion oder eine Freundesfunktion, aber nicht von außen.
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;
Sie können nicht auf eine private Variable zugreifen.Auch das solltest du nicht tun müssen.Ihre Methodensignatur sollte sein myObj.radius()
oder myObj.area()
als x1 y1 x2 y2
sind bereits Mitglieder der circle myObj
.Es ist also überflüssig, sie erneut als Argumente zu übergeben.