mikrocontroller.net

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


Autor: Sebastian Ulmer (sulmer)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Ulmer wrote:

> Nun bekomm ich Fehler beim kompilieren.

Welche?

Autor: Sebastian Ulmer (sulmer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Syntaxfehler : Fehlendes ';' vor '*'
'CSendeDoc'  : Fehlende Speicherklasse oder Typbezeichner
'Get Document' : Fehlende Speicherklasse oder Typbezeichner

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

class CSendeDoc;   // CSendeDoc gibt es tatsächlich. Wenn dieser
                   // Name im folgenden auftaucht, dann handelt es
                   // sich nicht um einen Tippfehler, sondern um den
                   // Namen einer Klasse. Näheres ist über diese Klasse
                   // nicht bekannt. Braucht es aber auch nicht, denn
                   // zur Vereinbarung eines Pointers reicht es schon,
                   // wenn der Compiler weiss, dass es eine Klasse dieses
                   // Namens gibt.

class CSendeverlauf : public CFormView
{
protected:
  CSendeverlauf();           // Dynamische Erstellung verwendet geschützten Konstruktor
  DECLARE_DYNCREATE(CSendeverlauf)

// Formulardaten
public:
  CSendeDoc* GetDocument();


Autor: Sebastian Ulmer (sulmer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.