kein geeigneter Standardkonstruktor gefunden
-
Hallo.
Ich habe ein Dialogfeld über den Ressourceneditor erstellt und auch die entsprechende Klasse generiert. Der vom Assistenten erstellte Konstruktor sieht so aus:
public: CMeinDialog(CWnd* pParent = NULL); // Standardkonstruktor
Jetzt wollte ich zusätzlich einen Zeiger auf die Doc-Klasse übergeben, um die Eingaben aus dem Dialog da zu sichern. Dazu habe ich den Konstruktor wie folgt geändert:
public: CMeinDialog(CMyAppDoc *pDoc, CWnd* pParent = NULL); // Standardkonstruktor
Soweit funktioniert auch das compilieren. Rufe ich dann aus einer Klasse das Dialogfenster mit .DoModal() auf bringt er mir eine Fehlermeldung:
error C2512: 'CMeinDialog': Kein geeigneter Standardkonstruktor verfügbar
Funktioniert das etwa nur bei nicht modalen Dialogfenstern? Wenn ja wie kann ich der modalen Dialogfeldklasse die Möglichkeit einräumen auf das Doc das Hauptapplikationsobjektes zuzugreifen?
-
Der Fehler tritt nicht erst bei DoModal auf, sondern schon, wenn du die Instanz der Dialogklasse erstellst. Gibst du denn da überhaupt einen CMyAppDoc* an?
-
Zeig mal die Zeilen für den Aufruf - das geht auch mit modalen Dialogen.
-
Stimmt natürlich, der Fehler tritt beim Instanzieren auf. Hier erst mal die Header:
#pragma once // CDocDialog-Dialogfeld class CMyAppDoc; //Vorwärtsdeklarartion class CMeinDialog : public CDialog { DECLARE_DYNAMIC(CMeinDialog) public: CMeinDialog(CMyAppDoc *pDoc, CWnd* pParent = NULL); // Standardkonstruktor virtual ~CMeinDialog(); // Dialogfelddaten enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung CMyAppDoc *pDoc; DECLARE_MESSAGE_MAP() };
und dann noch die Implementierung:
#include "stdafx.h" #include "MyApp.h" #include "MeinDialog.h" #include "MyAppDoc.h" // CDocDialog-Dialogfeld IMPLEMENT_DYNAMIC(CMeinDialog, CDialog) CMeinDialog::CMeinDialog(CMyAppDoc *pDoc, CWnd* pParent /*=NULL*/) : CDialog(CMeinDialog::IDD, pParent) { } CMeinDialog::~CMeinDialog() { } void CMeinDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMeinDialog, CDialog) END_MESSAGE_MAP()
Wie schon bemerkt tritt beim Erstellen der Instanz der Fehler auf. Ich habe dieses Beispiel aus einem Buch, allerdings war das da ein nicht modaler Dialog in einer MDI-Anwendung, wo es ja sinnvoll ist die Werte im Doc der Anwendung zu hinterleben, da das die ganze Laufzeit über betseht.
-
Interessanter wäre schon die Stelle, an der die Instanz erzeugt wird...
-
der wird im Doc des Applikationsobjektes erzeugt.
void CMyAppDoc::OnTestDialog() { // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein. CMeinDialog DatenEingabe; DatenEingabe.DoModal(); }
Alle wichtigen Header sind includiert.
-
void CMyAppDoc::OnTestDialog() { // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein. CMeinDialog DatenEingabe(this); DatenEingabe.DoModal(); }
Also wenn du den Konstruktor extra umbaust damit du den Zeiger übergeben kannst, dann solltest du den zeiger auch mit übergeben
Oder du lässt alternativ den anderen konstruktor auch noch "am leben".
Nachdem du den geändert hast, kennt der den Konstruktor ohne Paramter doch gar nicht mehr..
-
Danke für die Hilfe, genau so funktioniert es. Mir ist schon klar das ich den Zeiger übergeben muss, mir war nur nicht bewusst wie. Das es so einfach mit dem this-Zeiger geht - darauf wäre ich nicht so einfach gekommen. Lasse ich den anderen Konstruktor auch am Leben wäre dieser ja aufgerufen worden, allerdings ohne *pDoc und das wollte ich ja nicht.
Also nochmals vielen Dank für die Hilfe.