Pregunta

Soy bastante nuevo en C++, y no entiendo lo que está provocando este error:

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

Sé que el miembro de datos x1 (x2,y1,y2 así) es privado, pero yo soy de operación en el objeto myObj el uso de funciones que son miembros de la clase círculo, por lo que no trabajan todavía?Puede que alguien me explique lo que está mal aquí?

#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;
}
¿Fue útil?

Solución

Estás tratando de acceder a private los miembros fuera de la clase cuando llame radius y otros métodos.

Pero su verdadero problema es con la lógica.Por qué usted necesita para pasar parámetros a, por ejemplo, la radius método de la clase:

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

El círculo es auto-contenida, por qué no:

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

Mismo con:

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

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

También, tenga en cuenta que:

circle myObj;

crea un objeto no válido.Usted no debería tener que llamar populate_classobj sólo para hacerla válida.En su lugar, disponer de un constructor:

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

y crear el objeto como:

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

Otros consejos

Las diversas declaraciones de inserción al final de main trate de usar myObj.x1, que intenta utilizar el miembro x1 de myObj.Que no puede, porque x1 es privado.No importa lo que el código está haciendo con ese valor;privado es privado.Usted puede acceder al valor de dentro de una función miembro o un amigo de la función, pero no desde fuera.

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;

Usted no puede acceder a una variable privada.También usted no debería tener que hacer eso.Su método de firma debe ser myObj.radius() o myObj.area() como x1 y1 x2 y2 ya son miembros de la circle myObj.Por lo que pasar de nuevo como argumentos es redundante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top