الوصول إلى متغير البنية داخل اضع جالبة في فئة C ++
سؤال
حسنا، لدي شيء مثل هذا في C ++:
class MyClass{
private:
int someVariable;
int someOtherVariable;
struct structName{
int someStructVariable;
int someOtherStructVariable;
};//end of struct
public:
//getters & setters for the defined variables.
int getSomeStructVariable()
{
// this does not work I get this error: "error: expected primary-expression
// before '.' token"
return structName.someStructVariable;
}
};//end of class
وكيف يجب أن يكتب لي جالبة أو اضع في هذه الحالة؟
المحلول
وstructName
هو جزء من اسم نوع، وليس اسم المتغير. تحتاج إلى إعطائها اسما، شيء من هذا القبيل:
struct structName {
int someStructVariable;
int someOtherStructVariable;
} myStructure;
وبعد ذلك في استخدام استرجاع الخاص بك:
return myStructure.someStructVariable;
وهذا يجب أن تحصل على النتيجة التي تريدها. بدائل أخرى للمتغير العمرانية إلى فصل تعريف بنية من تعريف متغير:
struct structName {
int someStructVariable;
int someOtherStructVariable;
};
struct structName myStructure;
وأو إضافة في typedef
:
typedef struct structName {
int someStructVariable;
int someOtherStructVariable;
} structTypedefName;
structTypedefName myStructure;
نصائح أخرى
struct A {
A() : _n(0) {}
int get_n() const {
return _n;
}
void calculate(int a) {
_n = a * a * a;
}
private:
int _n;
};
وإليك مثال كاملة. إذا كنت ترغب في set_n
المرآة بدلا من الأمر الذي بالتلاعب في البيانات، ثم ربما يجب عليك إسقاط جالبة / اضع (كما كنت تستخدم بشكل غير صحيح)، وجعل الجمهور عضو بيانات.
وأيضا، تذكر: تحديد الطبقات مع أعمال struct
<م> مطابق م> إلى تحديد الطبقات مع class
ولكن لاستثناء واحد: بدلا الجمهور من القطاع الخاص مثل الوصول الافتراضية للأعضاء وقواعد
وانها ليست فكرة جيدة لكتابة جالبة / اضع لكل حقل هيكل. والحل الأفضل هو:
typedef struct {
int field1;
int field2;
} structType;
class MyClass {
private:
structType _structName;
public:
const structType & getStructName() const {
return _structName;
}
}
وحافظ على structType
وMyClass
منفصلة. استخدام جالبة على النحو التالي:
MyClass m;
int var;
var = m.getStructName().field1;
مطلوب const
أولا لإرجاع قيمة CONST. وهناك حاجة ثانية واحدة ل CONST-صحة .
وهناك طريقتان لتحديد واضعة:
class MyClass {
// ...
public:
// type 1
void setStructName(const structType &s) {
_structName = s;
}
// type 2
structType & setStructName() {
return _structName;
}
}
استخدم أول واحد على النحو التالي:
MyClass m;
structType s;
m.setStructName(s);
والإصدار الثاني تمكنك من تعديل حقول بنية منفصلة أيضا:
m.setStructName() = s;
m.setStructName().field1 = 10;
لاحظ أن واضع قد تحتاج بعض التعديلات إذا كانت بنية يحتوي المؤشرات.