根据M.M的要求,我已重新发布此问题。
这个问题是关于继承,而不是YSC之前认为的3规则。
我有一个班级(实际上是两个)
class A
{
private: // [!] ?
int *a;
public:
A(const A& other) : a{new int[...]}
{
std::copy(...)
}
}
class B : public A
{
private:
int *b;
public:
B(const B& other) : b{new int [...]}
{
std::copy(...)
}
}
显然,这些都是非平凡的课程。我们需要在复制构造函数中深度复制数据。
示例用法
int main()
{
B binst;
B binst2(binst); // [LABEL 1]
}
如何为class B
编写复制构造函数,以便int *a
正确复制[LABEL 1]
的值?
其他人提到了类之间的隐式类型转换。但我还不知道这究竟意味着什么。 (如何进行隐式转换。)
我确信这是一个简单的问题,但我似乎无法找到答案。
答案 0 :(得分:4)
在此设计中,复制构造函数为:
B(const B& other) : A(other), b{new int [...]}
您调用A
的copy-constructor来初始化此A
对象的B
成员。
注意:更好的设计是让每个资源管理对象都是自包含的。例如,如果B
实际上有两个指针成员初始化为b{new int}, c{new int}
,那么您的代码无法从第二个new
抛出的异常中恢复。
例如:
struct IntManager
{
int *i;
// here put your copy-constructors etc. etc.
};
struct A
{
IntManager a;
};
struct B : A
{
IntManager b;
};
这称为零度规则。您可以避免为A或B编写任何特殊函数(除了不是复制/移动构造函数的构造函数)。因此,您的代码仍然很简单,并且没有办法让它出错,并且您没有像在A
和B
示例中那样在任何地方进行代码重复。
NB。 std::unique_ptr<int>
可能会为您int *
提供所需的角色,如果是这样,那么请使用它来避免重新发明轮子。当指针具有所有权语义时,最好指出这一点。原始指针应该只用于指向其他人拥有的东西(即使这样,也要试着避免它)。