假设我的类定义为
A.H
#ifndef A_H
#define A_H
#include <vector>
class A
{
int n;
std::vector<A::B> elements;
public:
A();
A(int);
class B
{
int m;
A* a;
public:
B();
B(int);
B(int, A*);
};
};
#endif
A.cpp
#include "A.h"
A::A()
: n(0)
{
}
A::A(int x)
: n(x), elements(std::vector<A::B>(n))
{
for (int j = 0; j < this->n; j++)
{
B newElement(j, this);
this->elements[j] = newElement;
}
}
A::B::B()
: m(0), a(0)
{
}
A::B::B(int j)
: m(j), a(0)
{
}
A::B::B(int j, A* aPtr)
: m(j), a(aPtr)
{
}
我应该如何定义复制构造函数,重载赋值运算符和析构函数,以避免在删除时无限递归,并且如果可能的话,我必须避免使用new
? A::B
需要指向A
的指针来定义程序员可能决定添加的运算符。此外,程序员可能决定编写扩展A的类C和扩展C::D
的{{1}}
答案 0 :(得分:0)
我应该如何定义复制构造函数,重载赋值运算符和析构函数,以避免在删除时无限递归,并且如果可能的话,我必须避免使用新的
A::elements
的所有权由您的声明决定。 ~A
将破坏自有元素成员中的任何B
。这意味着A::B::a
可能必须被视为无主指针,并且在运行~B
时不会被删除。如果在某些情况下,A::B::a
由B
的实例拥有,那么B
可能需要添加一个成员来跟踪此所有权并仅在这些情况下释放。或者A::B::a
可以声明为std::shared_ptr<A>
(或类似)。但是,请记住,如果所有权是循环的,std::shared_ptr
仍可能泄漏。
如果能够确定“什么拥有什么”并且提出的关系不如“一切拥有其他所有东西”那么不透明,那么这种模糊性和复杂性就会被避免。