Присваивание внутри функции, которая передается как указатель?

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

Вопрос

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

каким будет значение pa,pb после выполнения функции

Редактировать как передать в качестве указателя возвращаемое значение, если pa,pb равно NULL

Это было полезно?

Решение

Как указывалось в других ответах - оба по-прежнему будут равны нулю после вызова.Однако есть два возможных решения этой проблемы:

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.

Большинство программистов, вероятно, выбрали бы ссылки, потому что тогда им не нужно ничего утверждать (ссылки никогда не могут быть нулевыми).

Другие советы

Они будут равны NULL, так как вы передаете их по значению.Если вы хотите передать его по ссылке, вы бы сделали это:

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