الوصول إلى متغير البنية داخل اضع جالبة في فئة C ++

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

  •  22-07-2019
  •  | 
  •  

سؤال

حسنا، لدي شيء مثل هذا في 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;

لاحظ أن واضع قد تحتاج بعض التعديلات إذا كانت بنية يحتوي المؤشرات.

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