【问题标题】:Is it possible to Inherit from a structure without having another initialized structure in C是否可以从一个结构继承而无需在 C 中具有另一个初始化结构
【发布时间】:2020-02-25 19:42:22
【问题描述】:

我是一名新的数据结构学生,正在尝试熟悉 c 结构。我知道从我过去的 python 经验中继承,所以我想在 c 中进行伪尝试。我的代码是这样的:

typedef struct{
    char name[20];
    int age;
    int weight;
    int selling_price;
} Animal;

typedef struct{
    Animal *animal;
    int can_speak;
}super_animal;

int main() {
    Animal monkey;
    strcpy(monkey.name,"Mustafa");
    monkey.age=19;
    monkey.weight=80;

    super_animal human;
    human.animal=&monkey;
    human.can_speak=1;
    printf("%s, can speak bool:%d\n",human.animal->name,human.can_speak);
    return 0;
}

我想从代码中删除中间的猴子步骤。是否可以使用这样的未分配结构指针?

【问题讨论】:

  • 什么是“中间猴步”?如果您要取消引用 animal 指针,则它需要指向有效内存或调用未定义的行为。你在这里正确地分配了monkey的地址。
  • @yano 嗯,我明白了。但是我不能仅仅创建一个字符数组并将我的名字存储在那里。然后将其传递给human.animal->name,甚至不将human.animal 分配给&monkey。 char 数组还有一个有效且可访问的内存地址。
  • 你为什么不让Animal成为super_animal的成员,没有指针?
  • @TarekDakhran 哦。我认为我们必须使用指针将结构存储在结构中。

标签: c oop pointers inheritance structure


【解决方案1】:

只要animal 具有Animal * 类型,它必须在使用前指向有效内存。该内存不必具有名称或被另一个具有名称的指针引用。也就是说,您可以通过直接为human分配内存来删除单独的monkey变量:

super_animal human = { .animal = malloc(sizeof *human.animal), .can_speak = 1 };
if (human.animal == NULL)
    HandleError();
strcpy(human.animal->name, "Mustafa");
human.animal->age = 19;
human.animal->weight = 80;

如果您改为将animal 成员的类型更改为Animal 而不是Animal *

typedef struct{
    Animal animal;
    int can_speak;
}super_animal;

因此直接在super_animal结构中嵌入一个Animal结构,则不需要提供单独的内存:

super_animal human = { .animal.name = "Mustafa", .animal.age = 19, .animal.weight = 80, .can_speak = 1 };
printf("%s, can speak bool:%d\n",human.animal.name,human.can_speak);

请注意,这会将.animal.name 更改为直接指向字符串文字,而不是对其进行复制。对于本示例,这不是必需的。有多种方法可以决定如何处理名称、如何初始化结构等等。

【讨论】:

  • 这回答了我所有的问题,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多