Autor Thema: Problem mit Globalem Objekt  (Gelesen 5214 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 29. December 2006, 19:14 »
Hi
Ich habe eine Klasse, um Debug-Informationen auszugeben.
Jetzt mochte ich ein Objekt dierser Klasse zum debuggen mehrer Funktionen nutzen. Deshalb muss das Objekt Global sein.

Aufgrund der im "C++ Kernel" - Tutorial beschrieben Probleme habe ich diese "__main" und "__atexit" funktion übernommen (und auch aufgerufen) und meinen Link-script dementsprechend erweitert.

Zum Problem:
Ich Initialisiere das Objekt, und benutze. Sobalt ich aber eine Funktion verlasse, sind alle Informationen verloren, sodas ich bei jedem Funktionsaufruf / Funktion das Onjekt neu initialisieren muss. (maw.: es ist mehr oder Weniger Lokal)

Habe ich irgendwas falsch gemacht / nicht beachtet??

Schema:
Klasse objekt;

void funktion1()
{
 objekt.init("Test",0,0,0x0C);
 objekt.print("test");
 return;
}

void funktion2()
{
  /*test2 wird nur ausgegeben, wenn ich objekt neu initialisieren (sonst test "test2" an der Adresse 0x00000000*/
 objekt.print("Test2");
 return;
}







Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 29. December 2006, 21:17 »
Hi

was du da implementierst ist ein klasisches singelton pattern. Hast du mal versucht deine implementierung in einem normalen c++ projekt zu verwenden?



Auserdem würe ich das halten der Instanc der Klasse selber überlassen.

class Singelton
{
   private :
       Singelton () // Constructor private. darf von ausen nicht gerufen werden können
      {
 
      }
   
      static singelton * pInstance= 0; // eine Instance davon. anfangs null bis zur ersten verwendung

   public :
     Singelton* getInstance() // liefert die zentrale instanc zurück.
     {
         if (instance == 0)
         {
            pIstance = new Singelton();
         }
         return instance;
     }
}


der Syntax wie immer ohne Pistole. ( komm aus der java welt deswegen ggf die notation von pointern und ähnlichem ggf fehlerhaft)

ps. das Singelton Objekct muss als Pointer zurückg gegeben werden. Nicht per Value, da sonst copiert wird!

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #2 am: 29. December 2006, 21:48 »
 :?

vereinfachter aufbau meiner Klasse: (Habe backbuffer, und zahlreiche I/O-Funktionne mal rausgelassen)
class klasse
{
 public:
  klasse(){init(0x07,0,0);}
  ~klasse(){;}
 
  void init(BYTE farbe, BYTE xposition, BYTE yposition);

 private:
  BYTE *frontbuffer;
  BYTE color;
  BYTE x;
  BYTE y;
};

void klasse::init(BYTE farbe, BYTE xposition, BYTE yposition)
{
 x = xposition;
 y = yposition
 color = farbe;
 frontbuffer = (BYTE*)0xB8000;
}

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 30. December 2006, 14:28 »
@Termite: Naja, ich würd noch den Copy-Constructor und den = operator private machen, andernfalls kannste ja trotzdem noch kopien machen. Außerdem würd ich das Objekt als referenz bei getInstance zurückgeben lassen und im Kernel wohl eher ne statische Variable für die Instanz nehmen (zumindest solange kein new da ist).

@RedEagle: Welches "C++ Kernel" Tutorial, wie machst du des, welcher Compiler, wird der C-tor überhaupt aufgerufen?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 30. December 2006, 15:57 »
Das "C++ Kernel"-Tutorial auf LowLevel (von TeeJay glaub'ich)
Compiler: gpp
Ich habe mir die *.obj - Informationne wie im tutorial beschrieben ausgeben lassen (mit "objdump"), und dort waren, wie erwartet ctor und dtor vorhanden.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 30. December 2006, 16:05 »
Wird den der Ctor überhaupt aufgerufen? Lass doch da mal ein Zeichen ausgeben oä...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #6 am: 30. December 2006, 16:12 »
Ja, der Constructor wird direkt beim Systemstart ausgeführt.

 

Einloggen