Назначение внутри функции, которая передается как указатель? - PullRequest
4 голосов
/ 06 января 2009
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(ClassA* pa,ClassB* pb)
{
pa = new ClassA;
pb = new ClassB;
}

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

EDIT как передать в качестве указателя является возвращение, если ПА, ПБ равен NULL

Ответы [ 4 ]

9 голосов
/ 06 января 2009

Как указано в других ответах - оба будут равны 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).

3 голосов
/ 06 января 2009

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

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

Обратите внимание, я не уверен, что вы пытаетесь достичь с помощью глобальных переменных. Они никогда не используются в этом примере, поскольку локальные переменные (параметры функции) скрывают их.

Я думаю, вам также нужно объявить тип возвращаемого значения для вашей функции, чтобы он был действительным C ++.

2 голосов
/ 06 января 2009
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;
}
0 голосов
/ 06 января 2009

NULL, потому что вы передаете указатели по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...