2 Stimmen

"class::data member is private" Fehler, aber ich bediene es mit einer Memberfunktion?

Ich bin ziemlich neu in C++, und ich 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 (x2, y1, y2 als auch) privat ist, aber ich operiere auf das Objekt myObj mit Funktionen, die Mitglieder der Klasse Kreis sind, so sollten Sie nicht noch arbeiten? Kann mir jemand erklären, was hier falsch 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;
}

4voto

Luchian Grigore Punkte 244505

Sie versuchen den Zugriff auf private Mitglieder außerhalb der Klasse, wenn Sie 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 bereits in sich geschlossen, warum nicht einfach:

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

Dasselbe gilt für:

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

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

Beachten Sie auch das:

circle myObj;

erzeugt ein ungültiges Objekt. Sie sollten nicht aufrufen müssen populate_classobj nur um sie gültig zu machen. Stattdessen sollten Sie einen richtigen Konstruktor haben:

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

und erstellen Sie das Objekt als:

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

2voto

Pete Becker Punkte 74051

Die verschiedenen Einfügeanweisungen am Ende von main versuchen zu verwenden myObj.x1 der versucht, das Mitglied x1 von myObj . Das können sie nicht, denn x1 ist privat. Es spielt keine Rolle, was der Code mit diesem Wert macht; privat ist privat. Sie können auf den Wert von innerhalb eine Mitgliedsfunktion oder eine Freundesfunktion, aber nicht von außen.

2voto

Lews Therin Punkte 10859
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. Sie sollten das auch nicht tun müssen. Deine Methodensignatur sollte sein myObj.radius() ou myObj.area() como x1 y1 x2 y2 sind bereits Mitglieder der circle myObj . Daher ist es überflüssig, sie erneut als Argumente zu übergeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X