Visual C++ View/Document

OP #857696
Lesenswert?
• ▲
▼
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?
#857731
Lesenswert?
• ▲
▼
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();
#857753
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren