خطأ "class::data member is Private"، لكني أعمل عليه باستخدام وظيفة عضو؟

StackOverflow https://stackoverflow.com//questions/12664615

سؤال

أنا جديد إلى حد ما على لغة C++، ولا أفهم ما الذي يؤدي إلى ظهور هذا الخطأ:

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

أعلم أن عضو البيانات x1 (x2,y1,y2 أيضًا) خاص، لكنني أعمل على الكائن myObj باستخدام وظائف أعضاء في دائرة الفصل، لذا ألا ينبغي أن يستمروا في العمل؟هل يمكن لأحد أن يشرح لي ما هو الخطأ هنا؟

#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;
}
هل كانت مفيدة؟

المحلول

أنت تحاول الوصول private أعضاء خارج الفصل عند الاتصال radius & أساليب أخرى.

لكن مشكلتك الحقيقية هي مع المنطق.لماذا تحتاج إلى تمرير المعلمات إلى، على سبيل المثال، radius طريقة فصلك:

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

الدائرة مكتفية بذاتها بالفعل، لماذا لا يقتصر الأمر على:

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

نفس الشيء مع:

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

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

لاحظ أيضًا أن:

circle myObj;

يقوم بإنشاء كائن غير صالح.لا ينبغي عليك الاتصال populate_classobj فقط لجعلها صالحة.بدلا من ذلك، لديك منشئ مناسب:

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

وقم بإنشاء الكائن على النحو التالي:

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

نصائح أخرى

عبارات الإدراج المختلفة في نهاية main حاول استخدام myObj.x1, ، الذي يحاول استخدام العضو x1 ل myObj.لا يمكنهم ذلك، لأن x1 هو خاص.لا يهم ما يفعله الكود بهذه القيمة؛الخاص هو خاص.يمكنك الوصول إلى القيمة من داخل وظيفة عضو أو وظيفة صديق، ولكن ليس من الخارج.

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;

لا يمكنك الوصول إلى متغير خاص.كما لا ينبغي عليك القيام بذلك.يجب أن يكون توقيع طريقتك myObj.radius() أو myObj.area() مثل x1 y1 x2 y2 هم بالفعل أعضاء في circle myObj.لذا فإن تمريرها مرة أخرى كوسائط أمر لا لزوم له.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top