Eigene Klasse richtig verwenden...



  • Hallo zusammen,

    Ich bin neu hier und komme auch schon mit den ersten Fragen 😉
    Eine Vorstellung gibts es im entsprechenden Forum 😉

    habe mir in einem C++ Projekt (Visual Studio 2008 Express) eine Klasse erstellt. Es handlt sich um eine kleine logging klasse, beim Instanzieren gebe ich ein paar Parameter mit und er kümmert sich dann um das erstellen des logfiles, kopieren alter Versionen, ein sauberes closen im Destruktor und so weiter.

    Die Klasse selbst funktioniert so weit auch wenn man da sicherlich noch mehr machen kann aber egal. Hier ist mein Problem:

    Ich habe das main.cpp und die Form1.h wo die Klasse der Form deklariert ist.
    Im main.cpp include ich meine logging Klasse und instanziere diese. Danach abhängig von einigen Dingen (konmfig file auslesen) wird die Form1 mit Application.RUn ausgeführt.

    Ledier habe ich dort keinen Zugriff auf die zuvor erzeugt logging Instanz, was mache ich falsch ??? Hier noch ein paar code Auszüge:

    Instanzierung und Initialisiserung der Klasse

    myLog m_myLog;
    	String^aga;
    
    	m_myLog.myLogInit("C:\\DATEN\\srmover.log",FALSE,7,"SRMOVER.EXE");
    	m_myLog.writeLog("checking for config file " + m_cfgFile + " ...",0);
            //zeile oben funktioniert
    
    	if (File::Exists(m_cfgFile))
    	{
    		m_myLog.writeLog("config file found, starting copy process...",0);
    		Application::Run(gcnew Form1()); //in dieser Form komm ich nicht an meine logging Instanz ran
    	}
    
    	m_myLog.writeLog("cleaning up and terminating...",0);
            //hier geht es wieder 
    
    	return 0;
    

    die Klassendefinition:

    #pragma once
    #include "string.h"
    
    using namespace SRMOVER;
    using namespace System;
    using namespace System::IO;
    
    ref class myLog
    {
    public:
    
    	myLog(void)
    	{
    
    	}
    
    	virtual ~myLog()
    	{
    		if ( m_logFile )
    		{
    			writeLog ("closing logfile " + m_log + " ..." , 0);
    			delete (IDisposable^)(m_logFile);
    		}
    	}
    
    	void myLogInit(String^ m_logName, BOOL m_replaceLog, int m_logCount, String^ m_pName)
    	{
    		int i;
    		String^ m_tempLog1;
    		String^ m_tempLog2;
    		m_logReplace = m_replaceLog;
    		m_progName=m_pName;
    		m_log=m_logName;
    
    		if (  File::Exists( m_logName ) )
    		{ 
    			if (m_logReplace)
    			{
    				File::Delete( m_logName );
    			} else
    			{
    				for (i=m_logCount;i>0;i--)
    				{
    					m_tempLog1=m_logName + "." + i;
    					m_tempLog2=m_logName +  "." + (i-1);
    					if (  File::Exists( m_tempLog1 ) )
    					{
    						File::Delete(m_tempLog1);
    					}
    					if (  File::Exists( m_tempLog2 ) )
    					{
    						File::Copy(m_tempLog2,m_tempLog1);
    					}
    				}
    				File::Copy(m_logName,m_logName + ".1");
    			}
    		} 
    		File::Delete( m_logName );
    		m_logFile = File::CreateText( m_logName );
    		writeLog("opening logfile: " + m_logName ,0);
    	}
    
    	void writeLog(String^ msg, int m_sevLev )
    	{
    		String^ m_logLine;
    		String^ m_sevInd;
    		DateTime m_now = DateTime::Now;
    
    		switch (m_sevLev)
    		{
    			case 0:	m_sevInd="---";
    			case 1:	m_sevInd="-?-";
    			case 2:	m_sevInd="-!-";
    //			otherwise:	m_sevInd="???";
    		}
    		m_logLine=m_now.ToShortDateString() + " " + m_now.ToShortTimeString() + " " + m_progName +" " + m_sevInd + ": " + msg ;
    		m_logFile->WriteLine(m_logLine);
    	}
    
    protected:
    		StreamWriter^ m_logFile;
    		String^ m_progName;
    		String^ m_log;
    		BOOL m_logReplace;
    };
    

    Wenn ich also die Instanz meiner Form verwenden will kennt er diese nicht warum? Er kennt übrigens auch keine anderen Variablen ich denke mal mir fehlt hier ein Stück Wissen, kann jemand helfen ?

    Viele Grüße, Jens



  • Übergib die Instanz einfach per Konstruktor oder setze sie via einer Methode / Property.

    Oder mache die Instanz doch gleich innerhalb der Form. Spricht etwas dagegen?

    Simon



  • Hallo Theta,

    Deinen ersten Vorschlag verstehe ich nicht, kannst Du mir das erläutern ?

    Den zweiten kann ich nur umsetzen, wenn ich die Form erst erzeuge und dann meinen Krams in der main.cpp erledige und dann danach erst die Form aufrufe...

    Oder ich nehme mein gesamtes processing in die Form rein...

    Aber dennoch es muss doch noch einen ordentlichen Weg geben ?

    Gruß, jens



  • Ungefähr so...

    /* main signatur */
    {
       myLog^ log = gcnew myLog(..);
    
       Application::Run(gcnew Form1(log));
    }
    

    Dazu musst Du dann den Konstruktor von Form1 anpassen.

    Simon



  • Hallo,

    danke noch einmal, aber ich bekomms nicht hin. Hast Du eventuell noch die Defifiniton des Konstruktors für mich? Ich habe es so versucht:

    Form1(myLog m_mylog)
    

    das funzt aber nicht, gibt einen Fehler:

    Kompilieren...
    1>SRMOVER.cpp
    1>v:\daten\msoffice\visual studio 2008\projects\srmover\srmover\srmover\Form1.h(27) : warning C4677: "Form1": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "myLog".
    1> v:\daten\msoffice\visual studio 2008\projects\srmover\srmover\srmover\myLog.h(9): Siehe Deklaration von 'myLog'
    1>.\SRMOVER.cpp(35) : error C2512: 'SRMOVER::Form1::Form1': Kein geeigneter Standardkonstruktor verfügbar
    1>Das Buildprotokoll wurde unter "file://v:\Daten\MSOffice\Visual Studio 2008\Projects\SRMOVER\SRMOVER\SRMOVER\Debug\BuildLog.htm" gespeichert.
    1>SRMOVER - 1 Fehler, 1 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Hat noch jemand eine Idee?

    Danke und Grüße, Jens



  • Kitaro schrieb:

    Hast Du eventuell noch die Defifiniton des Konstruktors für mich? Ich habe es so versucht:

    Form1(myLog m_mylog)
    

    So muss es sein:

    Form1(myLog^ m_mylog)
    

    BTW: ev. wäre C# was für dich. Generell ist C++/CLI nicht geeignet für Anfänger. Wenns denn unbedingt was mit C++ sein soll, empfehle ich nur natives C++ zu verwenden (auch mit VS Express möglich!).
    http://www.c-plusplus.net/forum/263084



  • 1>------ Erstellen gestartet: Projekt: SRMOVER, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>SRMOVER.cpp
    1>v:\daten\msoffice\visual studio 2008\projects\srmover\srmover\srmover\Form1.h(27) : warning C4677: "Form1": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "myLog".
    1> v:\daten\msoffice\visual studio 2008\projects\srmover\srmover\srmover\myLog.h(9): Siehe Deklaration von 'myLog'
    1>.\SRMOVER.cpp(35) : error C2664: 'SRMOVER::Form1::Form1(myLog ^)': Konvertierung des Parameters 1 von 'myLog' in 'myLog ^' nicht möglich
    1> Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    1>Das Buildprotokoll wurde unter "file://v:\Daten\MSOffice\Visual Studio 2008\Projects\SRMOVER\SRMOVER\SRMOVER\Debug\BuildLog.htm" gespeichert.
    1>SRMOVER - 1 Fehler, 1 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Also das geht auch nicht...

    ich bin kein Anfänger, habe nur ewig nix mit VC / VS gemacht. Damals war das alles noch MFC und relativ stringent.

    Ich werde beim nächten Projekt aif c# umsteigen, aber ich will das hier noch fertig haben.

    Wenn ich einen int übergebe funzt es.
    Wenn ich einen String übergebe funzt es.

    Habe jetz allerdings eine andere Meldung evtl. fällt wem was ein:

    1>------ Erstellen gestartet: Projekt: SRMOVER, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>SRMOVER.cpp
    1>v:\daten\msoffice\visual studio 2008\projects\srmover\srmover\srmover\Form1.h(27) : warning C4677: "Form1": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "myLog".
    1> v:\daten\msoffice\visual studio 2008\projects\srmover\srmover\srmover\myLog.h(9): Siehe Deklaration von 'myLog'
    1>.\SRMOVER.cpp(36) : error C2664: 'SRMOVER::Form1::Form1(myLog)': Konvertierung des Parameters 1 von 'myLog' in 'myLog' nicht möglich
    1> Konstrukt-class "myLog" kann aufgrund eines mehrdeutigen oder nicht verfügbaren Kopierkonstruktors nicht kopiert werden.
    1>Das Buildprotokoll wurde unter "file://v:\Daten\MSOffice\Visual Studio 2008\Projects\SRMOVER\SRMOVER\SRMOVER\Debug\BuildLog.htm" gespeichert.
    1>SRMOVER - 1 Fehler, 1 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Edit:

    Ich habs, die Deklaration von m_myLog war nix. Aber nun schreiebt meine Klasse auf einmal nichts mehr ins log... naja das bekomm ich schon hin irgenwie...

    Gruß, Jens

    -------------------
    Viele Grüße,

    Jens


Anmelden zum Antworten