关于C++中的vector,union和指针的问题

der*_*dji 1 c++ pointers vector unions

我的问题不是家庭作业问题,但我正在考虑在我的作业中使用这些概念.如果它有帮助,上下文是这样的:我需要跟踪几个union实例,它们属于我自己的一个类中作为类变量的联合.(注意:union实例的数量是未知的,所以我不能只有一个固定数量的union实例.

  1. Q1:如果我有一个联盟,说MyUnion,以及这个联盟的许多实例,我可以将它们放入像这样的向量中

    vector<union MyUnion> myVector(10);
    
    Run Code Online (Sandbox Code Playgroud)
  2. Q2:有一个联合指针是否有效?喜欢

    union MyUnion *myUnionPtr = new union myUnion;
    
    Run Code Online (Sandbox Code Playgroud)
  3. Q3:我正在考虑在我的实现中使用联合指针向量,这个概念是否正确?另外,它是C++中的常规方法吗?我是否需要重新考虑我的设计?

小智 12

  1. 如果union是CopyConstructable和Assignable,那么它符合std :: vector的要求.
    • 是: MyUnion* ptr = new MyUnion();
    • 指针容器在某些情况下有效,但是如果你想拥有一个拥有指针的容器,请查看Boost的ptr_*容器.但是,在这里看起来你要么有一个非指针容器,要么有一个非拥有指针的容器,其中任何一个都很好并且对于vector来说很常见.

默认情况下,所有类型都是CopyConstructable和Assignable.("可复制"用于表示这些概念的并集,但是标准单独指定它们.)这是因为复制ctors和op =被添加到类(联合是一个类类型),除非在某些情况下.网上有一些参考文献,但我不知道有哪一个在网上免费提供,可以解决这些问题.

你必须竭尽全力阻止它,例如:

  • 复制ctor或op =非公开
  • 使复制ctor或op =采用非const引用
  • 为类类型提供非CopyConstructable或非Assignable成员

例:

union CopyableUnion {
  int n;
  char c;
  double d;
};

union NonCopyableUnion {
  int n;
  char c;
  double d;

  NonCopyableUnion() {} // required, because any user-defined ctor,
  // such as the private copy ctor below, prevents the supplied
  // default ctor

private:
  NonCopyableUnion(NonCopyableUnion const&);
  NonCopyableUnion& operator=(NonCopyableUnion const&);
};

int main() {
  CopyableUnion a;
  CopyableUnion b = a; // fine, uses copy ctor
  b = a; // fine, uses op=

  NonCopyableUnion c;
  NonCopyableUnion d = c; // compile error (copy ctor)
  d = c; // compile error (op=)

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:仅仅因为某些东西是可复制的,并不意味着它可以做你想要的!例:

struct A {
  int* p;

  A() : p(new int()) {}

  // the provided copy ctor does this:
  //A(A const& other) : p(other.p) {}
  // which is known as "member-wise" copying

  ~A() { delete p; }
};

int main() {
  A a;
  {
    A b = a;
    assert(b.p == a.p); // this is a problem!
  } // because when 'b' is destroyed, it deletes the same pointer
  // as 'a' holds

  return 0; // and now you have Undefined Behavior when
  // ~A tries to delete it again
}
Run Code Online (Sandbox Code Playgroud)

当然,同样的事情也适用于工会.不过,该修复同样适用:

struct A {
  int* p;

  A() : p(new int()) {}

  A(A const& other) : p(new int(*other.p)) {}

  ~A() { delete p; }
};
Run Code Online (Sandbox Code Playgroud)

(如果你发现它,是的,如果你试图使用op =,A会有问题,就像它最初与复制ctor一样.)