Ich teste ein C++ - Programm (demonstriert ein Dekorator-Entwurfsmuster), fand aber ein seltsames Problem. Ein Beispielcode ist wie folgt. Die Fehlerzeile hatte versehentlich einen zusätzlichen new
Ausdruck, aber erstaunlicherweise kompiliert der Code und läuft mit Fehlerausgabe (der Dekorator wurde zweimal ausgegeben).C++: Neu gibt einen Typ zurück, kompiliert aber ok
$ ./a.out
simple window with scroll bar with scroll bar
Was ist hier passiert?
#include <iostream>
#include <string>
using namespace std;
class Window {
public:
virtual string desc() = 0;
virtual ~Window() {}
};
class SimpleWindow : public Window {
public:
string desc() { return "simple window"; }
};
class WindowDecorator : public Window {
protected:
Window *window;
public:
WindowDecorator(Window *window) : window(window) {}
};
class ScrollBar : public WindowDecorator {
public:
ScrollBar(Window *window) : WindowDecorator(window) {}
string desc() { return window->desc() + " with scroll bar"; }
};
int main()
{
ScrollBar scrollBar = new ScrollBar(new SimpleWindow()); // error line
cout << scrollBar.desc() << endl;
return 0;
}
Könnten Sie genauer beschreiben, welcher Teil davon Sie überrascht? – juanchopanza
Kann ich Ihnen empfehlen, von den Zeigern ein wenig zurückzukommen und RAII ein bisschen mehr zu suchen/zu üben? Diese Speicherlecks tun mir weh. –
Es sollte entweder lauten: ScrollBar scrollBar = ScrollBar (new SimpleWindow()); oder ScrollBar * scrollBar = neue ScrollBar (neues SimpleWindow()); Die Frage ist, warum der "neue" Operator in der Fehlerzeile einen Zeiger zurückgibt, aber kompiliert (mit Fehlerausgabe). – user2847598