New überladen nach Stroustrup "Die C++ Programmiersprache"



  • Hallo, ich hab das Buch "Die C++ Programmiersprache" von Stroustrup.
    Und ich habe den Quellcode seines Beispiels für das Überladen des new operators
    mit dem Borland C++ Builder 3.0 und dem Bloodshed Dev-C++ Compiler versucht zu compilieren. Jedoch erfolglos.

    1. Problem: Also der Code ist 1 zu 1 aus dem Buch übernommen!
    Compilermeldungen:

    42 H:\C++ Programme\New\main.cpp
    no matching function for call to `X::X ()'
    7 H:\C++ Programme\New\main.cpp
    candidates are: X::X(int)
    8 H:\C++ Programme\New\main.cpp
    X::X(const X &)

    #include <iostream>
    #include <stdlib.h>
    
    class X
    {
    public:
        X(int){};
    };
    
    void* operator new(size_t,void* p) {return p;}
    
    int main(int argc, char *argv[])
    {
    
      void *buf=reinterpret_cast<void*>(0xF00F);
      X* p2=new(buf)X(6);
    
      system("PAUSE");	
      return 0;
    }
    

    2. Problem: Hier scheint wohl irgendeine, leider im Buch nicht aufgeführte Headerdatei zu fehlen.

    [Linker error] undefined reference to Persistent' [Linker error] undefined reference toShared'

    #include <iostream>
    #include <stdlib.h>
    
    class X
    {
    public:
        X(int){};
    };
    
    class Bereich
    {
    public:
    	virtual void* alloc(size_t)=0;
    	virtual void free(void*)=0;
    };
    
    void* operator new(size_t gr,Bereich* a) {return a->alloc(gr);}
    
    extern Bereich* Persistent;
    extern Bereich* Shared;
    
    void g(int i)
    {
    	X* p=new(Persistent)X(i);
    	X* q=new (Shared)X(i);
    }
    
    void zerstoere(X* p,Bereich *a)
    {
    	p->~X();
    	a->free(p);
    }
    
    int main(int argc, char *argv[])
    {
      g(6);
    
      system("PAUSE");	
      return 0;
    

    Wenn mir jemand sagen kann was am Code falsch ist, oder welche Header wohlmöglich fehlen, wäre ich glücklich 🙂



  • GeraldR schrieb:

    #include <iostream>
    #include <stdlib.h>
    
    class X
    {
    public:
        X(int){};
    };
    
    void* operator new(size_t,void* p) {return p;}
    
    int main(int argc, char *argv[])
    {
      
      void *buf=reinterpret_cast<void*>(0xF00F);
      X* p2=new(buf)X(6);
    
      
      system("PAUSE");	
      return 0;
    }
    

    Also da ein sehr ähnliches Beispiel im Standard steht, würde ich mal sagen, dass der Code korrekt ist. Der Comeau beschwert sich noch über eine fehlende Exception-Spezifikation (er will throw()). Aber ansonsten.

    GeraldR schrieb:

    2. Problem: Hier scheint wohl irgendeine, leider im Buch nicht aufgeführte Headerdatei zu fehlen.

    [...]
    extern Bereich* Persistent;
    extern Bereich* Shared;
    [...]
    

    Ne. Da fehlt keine Header-Datei, da fehlen schlicht und einfach die Definitionen für Persistent und Shared.
    Du hast die beiden Variablen *deklariert*, aber nirgends definiert. Du musst also irgendwo noch die zwei fehlenden Definition hinpacken:

    // irgendwo.cpp
    #include "bereich.h"
    Bereich* Persistent = getPersistentAread();
    Bereich* Shared = getSharedArea();
    

Anmelden zum Antworten