2016-06-04 5 views
0

Ich habe folgendes Szenario:Ciclomatic Abhängigkeit und geteilt und schwacher Zeiger

enter image description here

Aber ich habe einige Probleme mit dem Speicher habe, da meine Dispatcher immer gelöscht wird, scheint vor seinem zu Window gesendet.

würde ein Pseudo-Code wie folgt aussehen:

class Kernel 
{ 
    shared_ptr<Window> window; 
    shared_ptr<Dispatcher> dispatcher; 
} 

class Window 
{ 
    weak_ptr<Dispatcher> dispatcher; 
} 

class Dispatcher 
{} 

Wie kann ich intelligente Zeiger korrekt verwenden, dieses Problem zu lösen?

+2

Können Sie Ihr Problem mit dem Frieden von Code zeigen? In Ihrem Schema muss der Kernel alle Objekte behalten, da das Fenster und der Dispatcher am Leben bleiben, solange der Kernel lebt. – AnatolyS

+2

[MVCE] (http://stackoverflow.com/help/mcve), bitte. – skypjack

+0

In Ihrem Code gibt es kein Problem. Fügen Sie einfach Forward-Deklaration vor Kernel für Window- und Dispatcher-Klassen hinzu. – AnatolyS

Antwort

1

Ich schrieb Beispiel http://cpp.sh/8dkv7

Wie Sie Ihren Code richtig sehen kann, ist:

#include <iostream> 
    #include <memory> 

    class Dispatcher; 
    class Window; 

    class Kernel 
    { 
    public: 
    std::shared_ptr<Window> window; 
    std::shared_ptr<Dispatcher> dispatcher; 
    }; 

    class Window 
    { 
    public: 
    std::weak_ptr<Dispatcher> dispatcher; 
    }; 

    class Dispatcher 
    { 
    }; 

    int main() 
    { 
    Kernel k; 
    k.window = std::make_shared<Window>(); 
    k.dispatcher = std::make_shared<Dispatcher>(); 
    k.window->dispatcher = k.dispatcher; 
    if(auto dispatcher = k.window->dispatcher.lock()) { 
     std::cout << "ok\n"; // i see ok, what about you? 
    } 
    } 
+0

Es kompiliert gut, aber es leckt, sobald ich versuche, den 'Dispatcher' vom' Fenster' zu erreichen –

+0

@DanielRibeiro können Sie den Beweis zeigen, dass Dispatcher tot ist? – AnatolyS