内部阶级,外部阶级的三条规则

时间:2016-09-14 22:58:11

标签: c++ inheritance

假设我的类定义为

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)
{

}

我应该如何定义复制构造函数,重载赋值运算符和析构函数,以避免在删除时无限递归,并且如果可能的话,我必须避免使用newA::B需要指向A的指针来定义程序员可能决定添加的运算符。此外,程序员可能决定编写扩展A的类C和扩展C::D的{​​{1}}

1 个答案:

答案 0 :(得分:0)

  

我应该如何定义复制构造函数,重载赋值运算符和析构函数,以避免在删除时无限递归,并且如果可能的话,我必须避免使用新的

A::elements的所有权由您的声明决定。 ~A将破坏自有元素成员中的任何B。这意味着A::B::a可能必须被视为无主指针,并且在运行~B时不会被删除。如果在某些情况下,A::B::aB的实例拥有,那么B可能需要添加一个成员来跟踪此所有权并仅在这些情况下释放。或者A::B::a可以声明为std::shared_ptr<A>(或类似)。但是,请记住,如果所有权是循环的,std::shared_ptr仍可能泄漏。

如果能够确定“什么拥有什么”并且提出的关系不如“一切拥有其他所有东西”那么不透明,那么这种模糊性和复杂性就会被避免。