【问题标题】:assign parts of struct to another struct in c将部分结构分配给c中的另一个结构
【发布时间】:2014-04-18 22:48:57
【问题描述】:

我想要在 c/c++ 中类似这样的概念

struct first{
   int a,b,c;
}my1;

struct second{
   int a,b,c;
   int extended;
}my2;

并且以某种方式能够拥有

my2=my1; 

(意味着只复制相同的部分。保持扩展不变)

我想解决这个问题

struct second{
     first first_;
     int extended;
 }my2;

并且拥有

my2.first_ = my1;

但这对我来说有点难看。有没有更明确的解决方案? 可能是扩展结构之类的东西?

【问题讨论】:

  • C 或 C++,还是两者的公共子集?
  • 您必须以某种方式指定要分配给的事物,以及要修改的事物的一部分。因此,您的解决方案尽可能简洁。 (“_”确实很丑,但你可以选择一个不同的名字来解决这个问题)。
  • 如果你想用 C++ 来做,那就拿起你的 C++ 书,阅读有关复制构造函数和赋值运算符的内容。
  • 我对 C 更感兴趣,因为我想稍后为 cuda 程序复制分配给这些的记忆。我很害怕 c++ 可能会引入额外的内存开销,这可能不会被困在移动数据中。(只是想)我也看到了这个stackoverflow.com/questions/2807138/…,它给出了类似的答案来使用 struct second: public first{ int extended};但我仍然不能做 my2=my1
  • 将问题更新为仅关于 C 的问题

标签: c++ c struct


【解决方案1】:

这样:

struct second : first
{
    int extended;

    second& operator=(const first& f)
    {
        first::operator=(f); extended = 0; return *this;
    }
};

【讨论】:

  • 这看起来很棒。你能解释一下{}里面的代码吗? first::operator=(f) 是做什么的?
  • @Soren 好的,谢谢。这带来了extended 的默认值是什么的问题,这是构造函数的工作......无论如何,假设它是0
  • @RoozbehG first::operator=(f) 执行被视为first 的(second)对象在分配另一个first f 时会执行的任何操作;也就是说,隐式为其a,b,c 成员分配来自f 的相应值。
  • 无需覆盖operator=:只需使用*(first*)&object = value;,它适用于C 和C++。
  • @Deduplicator 该问题有一个c++ 标签(也在标题中),后来被删除。我什至不会看关于 C 的问题。
【解决方案2】:

同样丑陋,但在这里:

my1 = *(first*)&my2;

【讨论】:

  • 我想我也可以用这个。但是编译器是否有可能在 my1 和 my2 变量之间生成一些不同的填充,因此它们的内存大小不匹配并且失败了?
  • @Roozbeh G,它可以。但是,还有另一条规则,如果两个具有共同初始序列的结构都是联合的成员,则可以为共同的初始序列取别名。因此,如果您包含代码union X { struct first f; struct second g; };,那么即使您从未实例化该联合,它也可以保证 Flibustier 的建议有效。 AFAIK 如果联合不存在,则没有任何实现会使用不同的结构,因此人们倾向于忽略它并假设编译器没有反常。
  • @Matt 反过来 my2 = *(second*)&my1; 怎么样?我的假设是你不能因为 sizeof(my2) > sizeof(my1)。
  • 是的,它会访问你不拥有的内存。
【解决方案3】:

您可以为struct second 重载= 运算符:

second & operator=(const first & s) {
    this->a = s.a;
    this->b = s.b;
    this->c = s.c;
    return *this;
}

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2015-11-06
    • 2013-03-04
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多