كيف يمكنني الوصول إلى المتغيرات في ناقلات<struct> *obj ؟
-
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)
{
}