سؤال

ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(ClassA* pa,ClassB* pb)
{
pa = new ClassA;
pb = new ClassB;
}

ماذا ستكون قيمة pa,pb بعد تنفيذ الوظيفة

تحرير كيفية المرور كمؤشر هو العودة إذا كانت السلطة الفلسطينية ، PB خالية

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

المحلول

كما هو موضح في الإجابات الأخرى - سيظل كلاهما فارغًا بعد المكالمة.ومع ذلك، هناك حلان محتملان لهذه المشكلة:

1) مراجع

void assignObject(ClassA*& pa, ClassB*& pb)
{
    pa = new ClassA;
    pb = new ClassB;
}

ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(pa, pb); // both will be assigned as expected.

2) مؤشرات

void assignObject(ClassA** pa, ClassB** pb)
{
    assert(pa != NULL); assert(pb != NULL);
    *pa = new ClassA;
    *pb = new ClassB;
}
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(&pa, &pb); // both will be assigned as expected.

من المحتمل أن يختار معظم المبرمجين المراجع لأنهم لن يحتاجوا إلى تأكيد أي شيء (لا يمكن أن تكون المراجع فارغة أبدًا).

نصائح أخرى

وسوف تكون فارغة، منذ كنت تمريرها من حيث القيمة. إذا كنت تريد أن تمر عليه بالرجوع، كنت تفعل هذا:

ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(ClassA*& pa, ClassB*& pb)
{
    pa = new ClassA;
    pb = new ClassB;
}

ملحوظة، وأنا لست متأكدا ما كنت تحاول تحقيق مع المتغيرات العالمية. انهم لم تستخدم قط في هذا المثال، منذ المتغيرات المحلية (معلمات وظيفة) إخفائها.

وأعتقد أنك تحتاج أيضا إلى تعريف نوع القيمة مقابل وظيفة الخاص بك من أجل أن يكون ساري المفعول C ++.

ClassA* pa = NULL;
ClassA* pb = NULL;

void assignObject(ClassA* &pa,ClassB* &pb)
{
    pa = new ClassA;
    pb = new ClassB;
}

وبدلا من ذلك:

ClassA* pa = NULL;
ClassA* pb = NULL;

void assignObject(ClassA** pa,ClassB** pb)
{
    *pa = new ClassA;
    *pb = new ClassB;
}

وNULL، لأنك تمر المؤشرات في من حيث القيمة.

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