2016-04-22 19 views
1

参照カウントを実装しようとしています。オブジェクトのすべてのコピーは、カウンタをインクリメントする必要があります。 私のコードの外観参照カウント付きコピーコンストラクタ

class Person{ 
public: 
    struct Kids{ 
     Kids(){ 
      count = 2; 
      boy = "Alex"; 
      girl= " Lisa"; 
     } 
     int count; 
     string boy; 
     string girl; 
    }; 

    Person(string name , int age){ 
     this -> name = name; 
     this -> age = age; 
    } 
    Person(const Person& a){ 
     one = a.one; 
     one -> count++; 
     age = a.age; 
     name = a.name; 
     for(int i = 0; i < 5; i++){ 
      family[i] = a.family[i]; 
     } 
    }; 
    void PrintIt(){ 
     cout << one -> count << endl; 
    } 
private: 
    Kids *one; 
    string name; 
    int age; 
    Kids family[5]; 

}; 

int main(){ 
    Person one("Jogn",50); 
    //return 0; 
    Person two(one); 
    two.PrintIt(); 
} 

そして、それはseg faultを投げます。私はポインタとして同じコンストラクタをコピーするオブジェクトを渡そうとしましたが、結果は同じです。ポインタを使ってオブジェクトを指すコピーコンストラクタを作成すると、参照カウントが可能になります。

+1

キッズ*をどこにでも初期化していません。そのため、NULLポインタは 'one - > count ++'行でderefenceになります。あなたはおそらく名前で年齢のコンストラクタ 'one = new Kids();'が必要です。また、あなたの実装はちょっと複雑かもしれません。なぜstd :: shared_ptrを使ってそれを行うのですか? –

+0

@AleksanderFular、正しいものであること、それは 'nullptr'ではない、どこでも指しているかもしれないが、とにかくUBだ。 – coredump

答えて

1
Kids *one; 

初期化されていないようです。あなたがそれに値をコピーするとき。この値はプライベートなので、また、私はそれのための任意の初期コードが表示されないので、ユニット化されています。コピー先でないPersonコンストラクタで

kids(new Kids()) 

のようなものを追加する必要があります。

ps。演算子=とデストラクタを忘れないでください。

3

std::shared_ptrを試しましたか?これはC++ 11で利用可能です。このテンプレートクラスは、十分にテストされ、既に開発されているという利点があります。ここにはlinkという文書があります。

0

私は静的変数をプライベートで作成し、クラス外ではスコープ解決演算子を使用してゼロに初期化します。その後、コンストラクタ内部で1つずつインクリメントします。オブジェクトを作成するたびにそのコンストラクターが呼び出され、静的変数が1つ増えます。そして、あなたが望むところでは、いつでもどこでもその変数を表示することができます(もう一度スコープ解決演算子を使用して)。

関連する問題