访问工会成员所需的类型转换?

时间:2012-08-23 08:30:44

标签: c++ casting struct unions

我对C ++中的以下代码有疑问:

typedef struct {
    int id;
    int age;
} Group1;


typedef struct {
    int id;
    char name;
    float time;  
} Group2;


typedef union {
    Group1 group1;
    Group2 group2;
} ServiceData;

typedef struct {
    ServiceData data;
} Time;

然后我有一个变量:

Group1 * group1;
group1 = new Group1;

group1->id = 10;
group1->age = 20;

然后有两种方法定义如下:

void method1(ServiceData * data) {
    //inside the method call method hello
    hello(data);
};

void hello(Group1 *group1) {
    printf("%d",group1->id);
}

我这样打电话给method1

method1((ServiceData *)group1);

但在method1内,当参数group1传递给方法hello()时,我希望在group1内获取id的值。我是否需要使用hello方法进行任何演员表?或者在method1内,在将其传递给(group*)之前,是否需要将其投放到hello()

3 个答案:

答案 0 :(得分:3)

您不需要演员,只需访问union中的正确字段:

void method1(ServiceData * data) {
    //inside the method call method hello
    hello(&data->group1);
};

答案 1 :(得分:1)

而不是

method1((ServiceData *)group1);

你应该这样做:

ServiceData data;
data.group1.id = 10;
data.group1.age = 20;
method1(data);

method1的实现应该是

void method1(ServiceData * data) {
    hello(&data->group1);
};

答案 2 :(得分:0)

当然,你必须写

  hello ( (Group1 * ) data);

(或写入数据 - > group1,其他答案)。

但是不要这样做,但是如果它是C ++那么使用继承:

 struct GroupBase {
    int id;
    virtual ~GroupBase {
    }
 }

 struct Group1 : public GroupBase {
    int age;
    virtual ~Group1 { }
 }

 struct Group2 : public GroupBase {
    char name;
    float time;
    virtual ~Group2 { }
 }

 void method1 (GroupBase* data) {
    hello (std::dynamic_cast<Group1*> (data));
 }