der*_*dji 1 c++ pointers vector unions
我的问题不是家庭作业问题,但我正在考虑在我的作业中使用这些概念.如果它有帮助,上下文是这样的:我需要跟踪几个union实例,它们属于我自己的一个类中作为类变量的联合.(注意:union实例的数量是未知的,所以我不能只有一个固定数量的union实例.
Q1:如果我有一个联盟,说MyUnion,以及这个联盟的许多实例,我可以将它们放入像这样的向量中
vector<union MyUnion> myVector(10);
Run Code Online (Sandbox Code Playgroud)Q2:有一个联合指针是否有效?喜欢
union MyUnion *myUnionPtr = new union myUnion;
Run Code Online (Sandbox Code Playgroud)Q3:我正在考虑在我的实现中使用联合指针向量,这个概念是否正确?另外,它是C++中的常规方法吗?我是否需要重新考虑我的设计?
小智 12
MyUnion* ptr = new MyUnion();默认情况下,所有类型都是CopyConstructable和Assignable.("可复制"用于表示这些概念的并集,但是标准单独指定它们.)这是因为复制ctors和op =被添加到类(联合是一个类类型),除非在某些情况下.网上有一些参考文献,但我不知道有哪一个在网上免费提供,可以解决这些问题.
你必须竭尽全力阻止它,例如:
例:
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一样.)
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |