std::wstring <Schlechtes Ptr>



  • Ja schon...
    es sind leider 17 Dateien; soll ich die hier posten?



  • andTryToMakeYourFunctionNamesNotTooLongAndBetterSplitFunctionsIfPossible();
    


  • paulrei schrieb:

    Ja schon...
    es sind leider 17 Dateien; soll ich die hier posten?

    Nein. Du sollst unwesentliches rauskürzen und zwischendurch immer wieder schauen, ob der Fehler noch besteht. Wenn du dann am Ende ein sehr stark gekürztes Programm hast (max. 100 Zeilen) und der Fehler immernoch auftritt, darfst du es gerne posten 😉



  • paulrei schrieb:

    Das Problem ist, dass nach der Initialisierung im VC++2010-Debugger stdCaption <Schlechtes Ptr> ist; ich kann stdCaption auch keinen Wert zuweisen.

    1. Was heißt "nach der Initialisierung"? An welcher Stelle im Code steht der Debugger?
    2. Was soll "ich kann stdCaption auch keinen Wert zuweisen" bedeuten?


  • Also...
    wenn man in Zeile 61 einen Haltepunkt setzt, ist zu diesem Zeitpunkt standardCaption "<Schlechtes Ptr>".

    @manni66: es heißt, dass ich keinen Ausdruck wie stdCaption = L"Hi"; im Code einfügen kann, weil dies den Fehler des Programms unten erzeugt.

    #include <string>
    
    struct ArgumentNullException {
    	std::wstring message;
    };
    template<typename T> class Coordinate {
    public:
    	Coordinate()
    	{
    		X = Y = 0;
    	}
    	Coordinate(T x, T y) 
    	{
    		X = x;
    		Y = y;
    	}
    	T X, Y;
    };
    template<typename T> Coordinate<T> operator+(Coordinate<T> &first, Coordinate<T> &second) {
    	Coordinate<T> ret;
    	ret.X = first.X + second.X;
    	ret.Y = first.Y + second.Y;
    	return ret;
    }
    struct WindowInfo {
    	unsigned int width, height;
    	unsigned int bits;
    
    	WindowInfo(unsigned int width = 640, unsigned int height  = 480, unsigned int bits = 16) {
    		this->width = width;
    		this->height = height;
    		this->bits = bits;
    	}
    };
    class GraphicsManager {
    public:
    	GraphicsManager(WindowInfo *windowInfo, std::wstring caption);
    	void init(WindowInfo *windowInfo, std::wstring caption);
    	void drop();
    };
    class Game {
    private:
    	GraphicsManager graphicsManager;
    	WindowInfo windowInfo;
    	std::wstring standardCaption;
    public:
    	Game() : graphicsManager(createGManagerInitWinInfoAndStdCaption()), standardCaption(L"HiRechts") {}
    	void shutDown();
    	GraphicsManager createGraphicsManager();
    	WindowInfo createWindowInfo();
    	GraphicsManager createGManagerInitWinInfoAndStdCaption();
    };
    int main() {
    	Game game;
    	game.shutDown();
    }
    void Game::shutDown() {
    	graphicsManager.drop();
    }
    GraphicsManager Game::createGManagerInitWinInfoAndStdCaption() {
    	standardCaption = L"Hi";
    	windowInfo = WindowInfo();
    	return GraphicsManager(&windowInfo, standardCaption);
    }
    GraphicsManager::GraphicsManager(WindowInfo *windowInfo, std::wstring caption) {}
    void GraphicsManager::drop() {}
    


  • <Schlechtes Ptr> (was für eine doofe Übersetzung) heißt eigentlich, das der Pointer nicht initialisiert ist. Wo ist jetzt das Problem, diesen Pointer vor der Benutzung zu initialisieren?



  • Du rust die Funktion ja auch aus der Initialisierungsliste herraus aus. Zu dem Zeitpunkt wurde aber für standardCaption noch garkein Konstruktor aufgerufen. Demzufolge kannst du auch noch nicht damit arbeiten.



  • Du rufst die Funktion "createGManagerInitWinInfoAndStdCaption" während der Konstruktion von Game auf, und das, bevor standardCaption initialisiert wurde.



  • Ah, danke; nach Verschieben der Initialisierungen in den Konstruktorrumpf klappts - danke 🙂



  • paulrei schrieb:

    Ah, danke; nach Verschieben der Initialisierungen in den Konstruktorrumpf klappts - danke 🙂

    Glückssache. Im Konstruktorrumpf sind das keine Initialisierungen mehr sondern Zuweisungen.


Anmelden zum Antworten