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 to
Shared'#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();