Ein Instanz verwendbar in allen MFC-Klassen



  • Hallo Zusammen,

    Ich muss einige SQL Abfragen in verschiedenen CDialog und CDocument Klassen
    ausfuehren.

    Das erste Gedanke alle SQL-Queries bei CDocument zu implementieren und diese bei CDialog rueberzuholen, shlug fehl. Weil die magische GetDocument() eine
    member funktion von CView ist, so dass ein einfacher:

    Cmy_Doc *pDoc = GetDocument();

    in meiner von CDialog abgeleitete Klasse nicht geht. Ein Mehrfachvererbung wird bei MFC nicht empfohlen(Siehe Buch Visual C++ 6 von Dirk Louis, seite 363). Damit kann ich meine CDialog auch nicht extra um CView erweitern.

    Ich denke, in dem Zusammenhang ist der einzige Weg, eine sqlManager Klasse zu implementieren, die nun sichtbar zu allen Klassen in dem Projekt ist. Wo muesste ich dann einen Instanz von sqlManager erzeugen, damit dieses Instanz zu allen Klassen zur Verfuegung steht? Waere stdafx.h/cpp dafuer geeignet? Wenn ja, muesste ich da eine neue Klasse anlegen. Muss man dann fuer diese Klasse bestimmte Name geben?

    Danke im voraus,



  • Du kannst schon im Dialog auf deine Doc-Klasse zugreifen. Dafür gibts zwei Varianten:

    1. Du übergibst dem Konstruktor einen Zeiger auf deine Doc-Klasse.

    CDeinDialog::CDeinDialog(CDeinDoc* pDoc, CWnd* pParent /*=NULL*/)
    {
        //....
    }
    

    Im Dialog erstellst du noch eine Membervariable vom Typ CDeinDoc* und übergibst ihr den Zeiger.

    2. Variante 2:
    http://www.codeguru.com/forum/showthread.php?t=282338&goto=nextoldest
    Du hangelst dich über AfxGetApp()->GetMainWnd() dann noch über GetActivView() zum Zeiger auf das Doc. Allerdings gefällt mir diese Rumcasterei immer nicht so.



  • Was ich in so einem Fall noch als relativ sauber empfinde, wäre den SQL Manager als statischen public Member in CMyApp zu implementieren. Damit kannst du dann von überall mit CMyApp::sglManager auf die Methoden zugreifen.



  • Du könntest ein Singleton aus SqlManager machen.



  • connan schrieb:

    Was ich in so einem Fall noch als relativ sauber empfinde, wäre den SQL Manager als statischen public Member in CMyApp zu implementieren. Damit kannst du dann von überall mit CMyApp::sglManager auf die Methoden zugreifen.

    AndyDD schrieb:

    1. Du übergibst dem Konstruktor einen Zeiger auf deine Doc-Klasse.

    super! hat wunderbar geklappt...
    Gruss,


Anmelden zum Antworten