Ich hab zu meinem MDI Projekt einen weiteren View und eine weitere Documentenklasse hinzugefügt. Diese werden in der InitInstance() im MultiDocTemplate registriert. Documentklasse: class CSendeDoc : public CDocument Viewklasse: class CSendeverlauf : public CFormView Nun benötige ich noch eine GetDocument() in meiner Viewklasse. Dafür hab ich diese als Memberfunktion eingefügt. Sendeverlauf.h class CSendeverlauf : public CFormView { protected: CSendeverlauf(); // Dynamische Erstellung verwendet geschützten Konstruktor DECLARE_DYNCREATE(CSendeverlauf) // Formulardaten public: CSendeDoc* GetDocument(); Sendeverlauf.cpp CSendeDoc* CSendeverlauf::GetDocument() { return (CSendeDoc*)m_pDocument; } Nun bekomm ich Fehler beim kompilieren. Das einzige was anderst als bei der vorgegebenen Documenten/View ist, das der View hier CFormView als Basisklasse hat und nicht CView. Die müsste trotzdem gehn oder?
Sebastian Ulmer wrote:
> Nun bekomm ich Fehler beim kompilieren.
Welche?
Syntaxfehler : Fehlendes ';' vor '*' 'CSendeDoc' : Fehlende Speicherklasse oder Typbezeichner 'Get Document' : Fehlende Speicherklasse oder Typbezeichner
Sebastian Ulmer wrote: > Syntaxfehler : Fehlendes ';' vor '*' > 'CSendeDoc' : Fehlende Speicherklasse oder Typbezeichner > 'Get Document' : Fehlende Speicherklasse oder Typbezeichner OK. Diese Fehlermeldungen sind immer ein Indiz dafür dass ein Datentyp nicht bekannt ist. Entweder ist das ein Tippfehler oder es fehlt ein #include In deinem Fall wird es wohl so sein, dass der Compiler nicht weis was denn ein CSendeDoc sein soll. Also mal überprüfen, ob am Anfang des Header Files auch das include erfolgt, mit dem CSendeDoc hereingezogen wird. In seltenen Fällen kann es auch dazu kommen, dass sich 2 Header Files gegenseitig includieren, weil jede Klasse den Namen der anderen Klasse benötigt. Das kann klarerweise nicht gehen und man muss sich mit einer Forward-Deklaration aus der Patsch helfen: Sendeverlauf.h
1 | class CSendeDoc; // CSendeDoc gibt es tatsächlich. Wenn dieser |
2 | // Name im folgenden auftaucht, dann handelt es
|
3 | // sich nicht um einen Tippfehler, sondern um den
|
4 | // Namen einer Klasse. Näheres ist über diese Klasse
|
5 | // nicht bekannt. Braucht es aber auch nicht, denn
|
6 | // zur Vereinbarung eines Pointers reicht es schon,
|
7 | // wenn der Compiler weiss, dass es eine Klasse dieses
|
8 | // Namens gibt.
|
9 | |
10 | class CSendeverlauf : public CFormView |
11 | {
|
12 | protected:
|
13 | CSendeverlauf(); // Dynamische Erstellung verwendet geschützten Konstruktor |
14 | DECLARE_DYNCREATE(CSendeverlauf) |
15 | |
16 | // Formulardaten
|
17 | public:
|
18 | CSendeDoc* GetDocument(); |
achso, ich muss die SendeDoc.h dann auch in der SendeView.h includen, es reicht nicht wenn diese in der SendeView.cpp includiert ist. Danke für eure Mühen
Sebastian Ulmer wrote: > achso, ich muss die SendeDoc.h dann auch in der SendeView.h includen, > es reicht nicht wenn diese in der SendeView.cpp includiert ist. Das kommt drauf an in welcher Reihenfolge die includes in SendeView.cpp sind. Aber am besten machst du es dir zur Gewohnheit, dass jedes File alles an includes hat, was es braucht. SendeView.h benötigt die Kentniss von CSendeDoc. Diese Klasse wiederrum steht in einem anderen Header File. Ergo inkludiert SendeView dieses Header File um zum SendeDoc zu gelangen. Tust du das nicht, dann bürdest du immer dem Verwender von SendeView.h auf, dass er daran denken muss, SendeDoc.h vor SendeView.h zu inkludieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.