Как псевдоним указателя - PullRequest
0 голосов
/ 24 марта 2011

У меня есть класс Foo, и я хочу сделать следующее. У меня есть несколько статических экземпляров указателей на объекты Foo, static Foo *foo1; static Foo *foo2;

Тогда в какой-то функции я хочу иметь универсальный указатель, который может действовать как они оба. Например,

Foo *either;
if (some_variable == 1)
{
    either = foo1;
}
else
{
    either = foo2;
}

Вот как я ожидал, что это сработает, но, похоже, он работает неправильно. Как это обычно делается? Я хочу либо БЫТЬ на самом деле foo1, либо foo2, когда я его использую.

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Я предполагаю, что вы назначаете либо до назначения foo1 и foo2. Отправленный вами код присваивает либо текущее значение либо foo1, либо foo2, а не future . Чтобы быть корректным после изменений foo1 или foo2, он должен быть указателем на то, на что он ссылается.

static Foo *foo1, *foo2;
Foo **either;
if(some_variable == 1) {
    either = &foo1;
} else {
    either = &foo2;
}

Поскольку любой из них теперь является указателем на указатель на объект, вам необходимо разыменовать его перед использованием. Пример:

if(*either == foo1) printf("either is foo1\n");
    else if(*either == foo2) printf("either is foo2\n");
    else printf("either isn't foo1 or foo2\n");

Этот код позволит либо продолжать указывать на то, что foo1 или foo2 находится после изменения foo1 или foo2.

0 голосов
/ 24 марта 2011

у меня работает

#include <stdio.h>

typedef struct Foo Foo;
struct Foo {
  int data;
};

void test(Foo *foo1, Foo *foo2, int first) {
  Foo *either;
  if (first == 1)
  {
    either = foo1;
  }
  else
  {
    either = foo2;
  }
  printf("either->data is %d\n", either->data);
}

int main(void) {
  Foo bar, baz;
  bar.data = 42;
  baz.data = 2011;
  test(&bar, &baz, 0);
  test(&bar, &baz, 1);
  return 0;
}

Также доступно на кодовой панели .

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