كيف يمكنني الوصول إلى المتغيرات في ناقلات<struct> *obj ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

كيف يمكنني الحصول على بلدي المتغيرات من ناقلات?

لا أستطيع استخدام ثنائي الإدراج المشغلين أو المساواة المشغلين.

في وقت سابق, أنا أعلن vector<someStruct> *vObj وخصصت ذلك ، ثم عاد vObj ويطلق عليه في هذه الوظيفة:

vector<sameStruct> firstFunc();

for (unsigned int x = 0; x < v->size(); x++)
{
   v[x];
}

عندما كنت في تصحيح ذلك ، v[x] الآن لديه كامل محتويات الأصلي ناقلات, كما فعلت من قبل دون منخفض/مؤشر.

ولكن أنا لا أعتقد أنني قد فعلت شيئا التقدم أبعد من ذلك.

لدي فقط حوالي 4 متغيرات داخل ناقلات;عندما كنت في تصحيح ذلك ، فقد المعلومات التي أريدها, لكن لا أستطيع الحصول عليه.

هل كانت مفيدة؟

المحلول

ت

وكما هو مكتوب هو مؤشر إلى متجه البنيات.

عند مؤشر مباشرة ضد كل ما تقوم به هو مؤشر الحسابية. ت [س] هو متجه البنيات في موقف س (على افتراض أن الخامس ومجموعة إذا كان مجرد كائن واحد في نهاية المؤشر ثم الخامس [س] ل x> 0 هو مجرد القمامة). وذلك لأنه يتم تطبيق [س] عدم أشار متجه إلى التي كتبها v ولكن إلى مؤشر ضد نفسها.

وتحتاج إلى dereference المؤشر ومن ثم المؤشر في ناقلات باستخدام شيء مثل:

(*v)[x];

وعند هذه النقطة لديك مرجع إلى كائن في موقف العاشرة، المؤرخة في ناقلات للحصول على وظائف الأعضاء / متغيرات الاستخدام:

(*v)[x].variable;

أو

(*v)[x].memberfunction(parameters);

إذا كنت لا تريد أن dereference متجه ثم الوصول إلى عنصر داخله قد حاولت شيئا مثل:

v->at(x);
v->at(x).variable;
v->at(x).memberfunction;

وهذه الطريقة التي يتم الوصول إلى وظيفة عضو في كائن تماما بنفس الطريقة التي يعامل بها عند يسمى:

v->size();

وآمل أن يساعد هذا.

نصائح أخرى

استخدام عامل التشغيل [] إلى الوصول إلى العناصر التي يجب أن تفعل ذلك على وجوه لا مؤشر إلى كائن.

محاولة ؛

(*vec)[x];

E. g.

for (int i = 0; i < vec->size(); i++)
{
  printf("Value at %d is %d\n", i, (*vec)[i]);
}

نلاحظ أنه عند استدعاء وظائف على مؤشر يمكنك عادة استخدام -> مشغل بدلا من . مشغل, ولكن يمكنك القيام بذلك بسهولة (*vec).some_func();بدلا من ذلك.

شركات مثل [], --, ++ وهلم جرا يمكن أن تعمل على حد سواء في الكائنات و المؤشرات.مع الكائنات كما أنها بمثابة وظيفة المكالمات, ولكن على المؤشرات كما أنها بمثابة عمليات حسابية على العنوان.

على سبيل المثال ؛

pointer[nth];
*(pointer + nth);

يكون بالضبط نفس التأثير - يعودون أقصى كائن من بداية المؤشر.(لاحظ موقع * في المثال الثاني ، ويسمى بعد يتم تطبيق الإزاحة.

اثنين من نصائح أخرى;

يمكنك أيضا تجنب الحاجة إلى إلغاء مرجعية مثل هذا عن طريق تمرير ناقلات كمرجع وليس مؤشر.انها ليست دائما خيارا مناسبا ولكنها لا تؤدي إلى رمز النظيف.

void my_func(std::vector<int>& vector)
{
  // vector can then be used as a regular variable
}

إذا كنت تنوي أن تمر ناقلات من نوع معين أن يعمل الكثير ثم يمكنك استخدام الرموز المميزة ل typedef كل الوضوح لانقاذ على الكتابة.

typedef std::vector<int> IntVector;

void my_func(IntVector& vector)
{
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top