Forum: PC-Programmierung Visual C++ View/Document


von Sebastian U. (sulmer)


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?

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Ulmer wrote:

> Nun bekomm ich Fehler beim kompilieren.

Welche?

von Sebastian U. (sulmer)


Lesenswert?

Syntaxfehler : Fehlendes ';' vor '*'
'CSendeDoc'  : Fehlende Speicherklasse oder Typbezeichner
'Get Document' : Fehlende Speicherklasse oder Typbezeichner

von Karl H. (kbuchegg)


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();

von Sebastian U. (sulmer)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.