0

我对 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传给method的时候hello(),我想拿到里面的id的值group1。我需要做任何演员hello阵容吗?或者在里面method1,我需要(group*)在传递给它之前将它投射到hello()吗?

4

3 回答 3

3

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

void method1(ServiceData * data) {
    //inside the method call method hello
    hello(&data->group1);
};
于 2012-08-23T08:35:46.097 回答
1

代替

method1((ServiceData *)group1);

你应该这样做:

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

的实现method1应该看起来像

void method1(ServiceData * data) {
    hello(&data->group1);
};
于 2012-08-23T08:38:21.143 回答
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));
 }
于 2012-08-23T08:36:06.327 回答