2017-01-13 11 views
0

C++およびOOPの新機能です。リストと繰り返しを理解しようとしているので、次のサンプルコードを作成しました。私はいくつかのThingオブジェクトを作成しますが、Thingが作成されると、コンストラクタはそのオブジェクトをListオブジェクトのリストに追加して、Thingのすべてのインスタンスを追跡できるようにしたいと考えています。 main()の最後で、私は物のリストを繰り返します。これを行うには良い方法がありますか、またはThingコンストラクタでこれを行う方法を指摘できますか?ありがとう!!クラスのすべてのインスタンスをリストオブジェクトに追加するコンストラクタ

#include <iostream> 
#include <list> 

class Thing; 

class Lists 
{ 
public: 
    std::list<Thing> things; 
    Lists() { 
     std::cout << "List object with list 'things' created" << std::endl; 
    } 
}; 

class Thing 
{ 
public: 
    int howMuch, pointer; 
    Thing(int x, Lists* y) 
    { 
     howMuch = x; 
     y->things.push_back(this); 
    } 
}; 

int main() 
{ 

    //create the object that holds the list of things 
    Lists lists; 

    //make some objects, and pass a pointer of the lists to the constructor 
    Thing thingA(123, &lists); 
    Thing thingB(456, &lists); 

    for (std::list<Thing>::iterator it = lists.things.begin(); it != lists.things.end(); ++it) 
     std::cout << "test" << it->howMuch << std::endl; 

    return 0; 
} 
+0

使用 '静的のstd ::リスト事を;'、あなたがオブジェクトポインタを渡す必要がありません。 。 –

+0

はあなたのリストに 'void addThing(int howMuch);'関数を持つことができました – tinkertime

+0

'std :: list things;'の代わりに 'std :: list もの;追加された '*'に注意してください。 –

答えて

0

あなたは、静的フィールド_things使用シングクラス自体の内部作成されたアイテムを保存することができます

#include <iostream> 
#include <list> 

class Thing 
{ 
    static std::list<Thing> _things; 

public: 
    int howMuch, pointer; 
    Thing(int x) : howMuch(x) 
    { 
     _things.push_back(*this); 
    } 

    static std::list<Thing> getAllThings() 
    { 
     return _things; 
    } 
}; 


std::list<Thing> Thing::_things; 

int main() 
{ 
    Thing thingA(123); 
    Thing thingB(456); 

    auto allThings = Thing::getAllThings(); 

    for (auto it = allThings.begin(); it != allThings.end(); ++it) 
     std::cout << "test " << it->howMuch << std::endl; 

    return 0; 
} 
+0

これと元の例では、Thingが破棄されるとすぐに大きな問題に直面します。最も簡単なシナリオでのみ動作します。 –

+0

@FrançoisAndrieux、現在のところ定義されている「もの」のために、私たちはどのように問題に遭遇するのか分かりません。私はあなたがオブジェクトが破壊された後にそれを使用することを意味する問題によって考えています。しかし、「物」には所有権移転を必要とするフィールドは含まれていません。 'Thing'をどのように変更したいのか、またそのインスタンスを追跡する方法によって、' Thing'の特別なコピーを作るか、リストから破壊された 'Thing'を削除することができます。 – Max

+0

@Max、ありがとう! @Francoisは、あなたが前のコメントで言及したポインタ「」を使って解決されたこれらの「大きな問題」に対するあなたの解決策ですか? – Ben

関連する問題