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;
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top