输入铸造结构构件

时间:2010-12-15 16:29:11

标签: c++ c visual-c++

我有结构(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 个答案:

答案 0 :(得分:1)

C和C ++是静态类型语言。你不能这样做。如果你宣称某些东西是苹果,它将一直保持苹果直到时代结束。

答案 1 :(得分:1)

虽然它们看起来是相同的类型(并且在这个简单的情况下是相同的),但编译器认为它们是不同的类型。这对于更复杂的情况或在C ++中是有意义的,其中类型系统比纯C更复杂。

你通常不应该依赖编译器技巧或hackery来做这种分配。相反,做得恰当。直接指定字段,或者为了简化代码,可以在这些行中创建辅助函数:

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

C ++还有一个赋值运算符,您可以重载它来为您完成工作(而不是创建一个命名的辅助函数),但我怀疑这超出了您目前的舒适度。

答案 2 :(得分:1)

不知道为什么要这样做,很难推荐一个策略。这里有几个选项。

选项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
};