Тип приведения члена структуры - PullRequest
0 голосов
/ 15 декабря 2010

У меня есть структура (A), и она принимает другую структуру (B) в качестве члена.Теперь я хочу, чтобы структура C была членом A вместо B. И B, и C имеют одинаковый тип

typedef struct
{
 int a;
 B b;
}A

typedef struct
{
 int a;
}B

typedef struct
{
 int a;
}C

Как я могу назначить struct C в качестве члена вместо B. Как выполнить типизацию?*

Ответы [ 3 ]

1 голос
/ 15 декабря 2010

Хотя они выглядят одинакового типа (и в этом простом случае идентичны), они считаются компилятором разных типов.Это имеет смысл для более сложных случаев или в C ++, где система типов более сложна, чем в чистом C.

Как правило, вы не должны полагаться на хитрости компилятора или хакерство для выполнения такого рода назначения.Вместо этого сделайте это правильно.Либо непосредственно присваивайте поля, либо, чтобы упростить код, создайте вспомогательную функцию по следующим направлениям:

void ASetBWithC(A *a, C c) {
    assert(a != NULL);
    a->b.a = c.a;
}

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

1 голос
/ 15 декабря 2010

Не зная, почему вы хотите это сделать, сложно рекомендовать стратегию.Вот несколько вариантов.

Вариант 1. Использование шаблонов.(Только C ++)

template <type T>
struct A
{
  int a;
  T* t;
};

struct Foo
{
  int a;
};

struct B : public Foo
{
};

struct C : public Foo
{
};

struct A<Foo> A_foo;

struct B;
struct C;

A_foo.t = &B; //OK! This can now take pointer to any class that extends Foo.
A_foo.t = &C; //OK!

Вариант 2: сделать структуру A содержащей пустоту * (не рекомендуется, вы потеряете все типы безопасности)(Оба C / C ++)

struct A 
{
  int a;
  void* foo; // you can now assign any pointer to foo :-S
};
1 голос
/ 15 декабря 2010

C и C ++ являются статически типизированными языками.Вы не можете сделать это.Если вы объявите что-то как яблоко, оно останется яблоком до конца времен.

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