Pergunta

Sou bastante novo em C++ e não entendo o que está provocando esse erro:

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

Eu sei que o membro de dados x1 (x2,y1,y2 também) é privado, mas estou operando no objeto myObj usando funções que são membros do círculo de classe, então elas ainda não deveriam funcionar?Alguém pode me explicar o que há de errado aqui?

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

Solução

Você está tentando acessar private membros fora da classe quando você liga radius & Outros métodos.

Mas seu verdadeiro problema é com a lógica.Por que você precisa passar parâmetros para, por exemplo, o radius método da sua classe:

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

O círculo já é independente, por que não apenas:

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

Mesmo com:

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

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

Além disso, observe que:

circle myObj;

cria um objeto inválido.Você não deveria ter que ligar populate_classobj apenas para torná-lo válido.Em vez disso, tenha um construtor adequado:

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

e crie o objeto como:

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

Outras dicas

As várias declarações de inserção no final do main tente usar myObj.x1, que tenta usar o membro x1 de myObj.Eles não podem, porque x1 é privado.Não importa o que o código esteja fazendo com esse valor;privado é privado.Você pode acessar o valor de dentro uma função de membro ou uma função de amigo, mas não de fora.

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;

Você não pode acessar uma variável privada.Além disso, você não deveria ter que fazer isso.A assinatura do seu método deve ser myObj.radius() ou myObj.area() como x1 y1 x2 y2 já são membros do circle myObj.Portanto, passá-los novamente como argumentos é redundante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top