Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » eigene Klassen in Mfc

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
17.11.2003, 10:44 Uhr
~Luke1410
Gast


Ich versuche verzweifelt eine eigene Klasse in meine MFC-Anwendung einzubauen.

Sobald ich jedoch eine Instanz von ihr anlege, werde ich mit Fehlermeldungen überhäuft:


Zitat:
cDocuments and Settings\Kenju\Mes documents\Projets Visual Studio\DAoC-DoC\DAoC-DoCDlg.h(82) : error C2146: erreur de syntaxe: absence de ';' avant l'identificateur 'Test_001'
>> Syntaxfehler, fehlendes ";" vor "Test_001"
cDocuments and Settings\Kenju\Mes documents\Projets Visual Studio\DAoC-DoC\DAoC-DoCDlg.h(82) : error C2501: 'CDAoCDoCDlg::CTest_AutoReboot': Spécificateurs de type ou de classe de stockage manquants
cDocuments and Settings\Kenju\Mes documents\Projets Visual Studio\DAoC-DoC\DAoC-DoCDlg.h(82) : error C2501: 'CDAoCDoCDlg::Test_001': Spécificateurs de type ou de classe de stockage manquants



DAoC-DoCDlg.h:

Code:
// DAoC-DoCDlg.h : Headerdatei
//

#pragma once
#include "afxdlgs.h"
#include "afxwin.h"
#include "resource.h"
#include "test_001.h"


// CDAoCDoCDlg Dialogfeld
class CDAoCDoCDlg : public CDialog{
[...]
private:
    CTest_AutoReboot Test_001;  // Auf diese Zeile beziehen sich die Fehlermeldungen
};



Test001.h:

Code:
#pragma once
#include "basetest.h"

class CTest_AutoReboot : protected  BaseTest<bool>
{
public:
    CTest_AutoReboot(void);
    ~CTest_AutoReboot(void);
private:
    void Save(bool);
    void Set(bool);
    bool Test(void);        // 0 = Automatischer Neustart ist aus, 1 = an
};



Ich bin jetzt seit 6 Tagen an diesem Fehler, habe Bücher gewälzt, FAQs gelesen und in Foren gesucht, aber keine Lösung finden können.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.11.2003, 11:56 Uhr
Tommix



Hallo,
der Fehler könnte auch in basetest.h liegen, evtl. fehlt die Definition des Konstruktors (die muss bei Templates mit in den Header und nicht in ein cpp file).

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.11.2003, 12:16 Uhr
~Luke1410
Gast


basetest.h

Code:
#pragma once

#include "daoc-docdlg.h"
#include "md5.h"

template<class Temp> class BaseTest : protected CDAoCDoCDlg, protected MD5{
public:
    inline void Adjust(Temp);    // Aufurf bei Settingänderung -- tCurSetting = Temp
    inline void Fix(void);        // ruft Save auf, wenn HasChanged TRUE und aktualisiert Settings
                                // Aufruf bei Übernehmen -- tOldSetting = tCurSetting
    inline void Check(void);    // ruft Test auf wenn bTest=true, aktualisiert Settings und Oberfläche
                                // Aufruf bei Überprüfen
protected:
    inline BaseTest(void);        // bTest = TRUE
    inline ~BaseTest(void);

    bool bTest;                        // wird auf FALSE gesetzt, wenn Test nicht mehr erforderlich
private:
    inline bool HasChanged(void);    // vergleicht tCurSetting mit tOldSetting -- = TRUE, falls ungleich

    virtual void Save(Temp) = 0;    // Speichert aktuelle Einstellungen
    virtual void Set(Temp) = 0;        // Aktualisiert Oberfläche
    virtual Temp Test(void) = 0;    // Testet, ob Fehler besteht, aktualisiert bTest, gibt Wert zurück

    Temp tOldSetting;                // aktuell gespeicherte Einstellungen
    Temp tCurSetting;                // aktuell ausgewählte Einstellung
};

template <class Temp>
BaseTest<Temp>::BaseTest(void){
    bTest = TRUE;
}

template <class Temp>
BaseTest<Temp>::~BaseTest(void){
}


template <class Temp>
void BaseTest<Temp>::Adjust(Temp){
    tCurSetting = Temp;
}

template <class Temp>
void BaseTest<Temp>::Fix(void){
    if(HasChanged()){
        Save(tCurSetting);
        tOldSetting = tCurSetting;
    }
}

template <class Temp>
bool BaseTest<Temp>::HasChanged(void){
    return(tOldSetting != tCurSetting);
}

template <class Temp>
void BaseTest<Temp>::Check(void){
    // testen, falls Test erforderlich ist (bTest = True)
    if(bTest){
        tOldSetting = Test();

        // Anzeige und Settings aktualisieren, falls Einstellungen verändert wurden
        if(HasChanged){
            Set(tOldSetting);
            tCurSetting = tOldSetting;
        }
    }
}



kann da leider auch keinen Fehler finden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.11.2003, 13:22 Uhr
Tommix



Ich glaube, ich hab Ihn:
BaseTest ist von CDAoCDoCDlg abgeleitet und letzterer enthält somit ein von sich selbst abgeleitetes Element als Member. Da stimmt, glaube ich, die Programmlogik nicht. Der Fehler entsteht, weil die beiden Header sich gegenseitig einbinden.

Gruss, Tommix

Dieser Post wurde am 17.11.2003 um 13:22 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.11.2003, 14:59 Uhr
~Luke1410
Gast


Ich hatte mir das ganze so vorgestellt:

BaseTest sollte als Schnittstelle für die einzelnen Testklassen fungieren. D.h. die Klassen: CTest_xxx sind vom Template BaseTest abgeleitet und greifen nicht selbst auf Elemente des Dialoges zu.
Vorteil: Ich brauche Grundfunktionen nur einmal in BaseTest einzubauen und nicht per Copy-Paste in jede einzelne Test-Funktion.

Im Dialog soll dann, wenn auf einen Button geklickt wird die Testmethode jeder einen CTest-Klasse ausgeführt werden (Save und Adjust entsprächend bei anderen Events).

Wie soll ich das dann realisieren, wenn es so nicht funktioniert?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.11.2003, 15:30 Uhr
Tommix



Das ist schon ok so. Die CTest_xxx - Klassen lassen sich auch erstellen. Du kannst sie aber nicht innerhalb von CDAoCDoCDlg verwenden. Diese Klasse ist ja gerade die Vorlage, wenn ich richtig verstehe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.11.2003, 17:19 Uhr
~Luke1410
Gast


CDAoCDoCDlg ist die Klasse für den Hauptdialog.

Von dieser Klasse ist das rein virtuelle Template BaseTest abgeleitet.

Von BaseTest dann Test_1.

Im Hauptdialog kann man dann auf den Knopf "Überprüfen" klicken. Dieser soll dann die Methode Test von Test_1 aufrufen.

Wie soll ich das nun aber machen?

BaseTest muss vom Dialog abgeleitet werden, weil Test_x über die Methode Adjust auf Elemente im Dialog zugreift und diese verändert bzw. dere Status abrufen muss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.11.2003, 17:40 Uhr
Tommix



In dem Fall erzeugst Du eine Instanz von Test_1 und setzt sie an Stelle von CDAoCDoCDlg ein, würde ich sagen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.11.2003, 17:49 Uhr
~Luke1410
Gast


Da kommt das nächste Problem:

Was mache ich dann mit Test_2? Das würde dann ja in einem eigenen Dialog operieren und nicht im gleichen, wie Test_1.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.11.2003, 07:25 Uhr
Tommix



Wenn Test den Hauptdialog verändern soll, muss es so oder so direkt auf den Hauptdialog zugreifen und nicht auf abgeleitete Klassen, das wären ja andere Objekte. Ich würde BaseTest nicht von der Dialogklasse ableiten, sondern statt dessen BaseTest einen Zeiger auf die Dialoginstanz übergeben. Das ein Dialog quasi auf Knopfdruck die Klasse wechselt, geht IMHO nicht.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: