2016-09-14 7 views
0

は私がルール、外部クラス

ああ

#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を書くことを決めるかもしれA::B

+0

ネストされたクラスを使用しないでください。 –

+0

@ThomasMatthews私は教授が喜ばれるとは思わない。 – xinaiz

+0

その場合、OPはStackOverflowではなく教授に尋ねるべきです。 :-) –

答えて

0

私はコピーコンストラクタ、オーバーロードされた代入演算子、と私は削除に無限再帰を避けること、そして私が避けるようなデストラクタを定義する必要がありますどのように、可能であれば、新しいものを使用する必要があります

オーナーシップA::elementsはあなたの宣言によって決定されます。 ~Aは、所有している要素メンバーのBを破壊しようとしています。これは、~Bが実行されたときにA::B::aが所有されていないポインタとして扱われ、削除されない可能性が高いことを意味します。場合によっては、A::B::aBのインスタンスによって所有されている場合、Bは、この所有権を追跡し、このような状況下でのみ無料のメンバーを追加する必要があります。あるいは、A::B::astd::shared_ptr<A>(または同様のもの)として宣言できます。ただし、オーナーシップが円形であると、std::shared_ptrが潜在的にリークする可能性があることに注意してください。

「何を所有しているか」を判断し、「すべてが他のものを所有している」より不透明でない関係を思いつくことができれば、このあいまいさと複雑さは避けられます。

+0

問題は、整数グループと整数リング構造のC++実装である 'IntegerGroup'、' IntegerRing'を実装しようとしていることです。 –

+0

また、ポインタだけがコピーされ、 'new'も使用されなかった場合はどうなりますか? –

+0

これは非公式の弱い関係を示唆しています。これは安全でない場合は一般的なC++のパターンです。 –

関連する問題