2016-12-27 6 views
-2

Der Header ist definiert wieerstellen Objekte in Memberfunktion

class MyClass_A; 
typedef map<string, MyClass_A*> MyMap 
typedef vector<MyClass_A*>  MyList 

class MyClass_A 
{ 
    // define some functions 
} 

class MyClass_B 
{ 
public: 
    void check(){ //create MyClass_A pointer to store in myMap and myList } 
private: 
    MyMap myMap; 
    MyList myList; 
} 

Die Hauptfunktion ist wie

int main() 
{ 
    MyClass_B class_B; 
    class_B.check(); 
    /* 
    do some works 
    */ 
} 

I MyClass_A Objekte in Schach definieren möchten, die eine Elementfunktion in MyClass_B ist. Und die Objekte würden nicht bis zum Ende der Hauptfunktion zerstören.

Ich habe einige Methoden ausprobiert, aber die Objekte würden entfernen, wenn das Element check member verlassen. Gibt es eine Lösung?

+0

* Die Objekte würden entfernen, wenn die Funktion check member verlassen würde * - äh, soweit ich weiß, gibt es in C++ keine Garbage Collection wie in Java (wo man eine Instanz verlieren könnte, wenn man sie nie referenziert). könntest du wenigstens einen Hinweis darauf geben, was * einige Arbeiten * tun und wie 'void check()' funktioniert. es könnte einen Einblick geben. –

+0

Sie sollten diese Objekte mit 'new' erstellen, damit sie beim Verlassen der Funktion' MyClass_B :: check() '... nicht verschwinden. –

+0

Die Namen' _MAP' und '_LIST' sind, abgesehen davon, dass sie nicht unkonventionell sind, nicht legal in C++. Namen, die mit einem Unterstrich beginnen, dürfen keinen zweiten Unterstrich oder einen Großbuchstaben als zweites Zeichen haben. –

Antwort

1

Anstatt rohe Zeiger zu speichern, verwenden Sie intelligente Zeiger:

class MyClass_B 
{ 
public: 
    void check(){ 
    //create MyClass_A pointer to store in myMap and myList 
    Ptr_A obj = std::make_shared<MyClass_A>(); 
    myMap["hello"] = obj; 
    myList.push_back(obj); 
    } 

private: 
    typedef std::shared_ptr<MyClass_A> Ptr_A; 
    std::map<std::string, Ptr_A> myMap; 
    std::list<Ptr_A> myList; 
} 

Jetzt sind die Lebensdauern von MyClass_A Instanzen werden automatisch verwaltet. Wenn eine Instanz von MyClass_B zerstört wird, werden auch die darin enthaltenen Objekte zerstört.

+0

Vielen Dank für die Antwort. Ist es möglich, MyClass_A-Zeiger innerhalb oder außerhalb der Prüffunktion für dieses Problem zu deklarieren? – ycliu

+0

@ycliu: Ich weiß nicht, was Sie jetzt fragen. –

+0

Verwenden Sie einfach 'map ' anstelle von 'map '. Und das Problem wird gelöst mit 'MyClass_A * tmp = new MyClass_A'. – ycliu