Problem: Explizite Implementierung des Copyconstructors notwendig?



  • Guten Abend,
    ich bastel mir derzeit eine Klasse für Ausnahmen im Zusammenhang mit DirectX welche Fehlermeldungen zurückgeben kann sowie auch entsprechend in eine Logdatei die Fehler protokollieren kann mit allen möglichen Daten. Nun ist mir aufgefallen, wenn ich den expliziten Copyconstructor nicht implementiere kommt es zu Fehlern.

    Fehler C2280 "dxexception::dxexception(const dxexception &)" : Es wurde versucht, auf eine gelöschte Funktion zu verweisen DxException1 c:\users\jan\source\repos\dxexception1\dxexception1\program.cpp 9

    Wenn ich ihn implementiere auch wenn dieser ein leeres Klammernpaar bekommt funktioniert alles reibungslos. Ich wollte ihn auch mal testweise eine Ausgabe machen lassen aber er macht allerdings keine. Vielleicht wisst ihr warum ich den mit implementieren muss oder vielleicht mache ich irgendwo etwas falsch?

    Hier die Klasse:

    #pragma once
    #ifndef _DXEXCEPTION_
    #define _DXEXCEPTION_
    
    #define WIDE2(x) L##x
    #define WIDE1(x) WIDE2(x)
    #define ERRFILE WIDE1(__FILE__)
    #define ERRFUNC __FUNCTIONW__
    #define ERRLINE __LINE__
    
    #include <string>
    #include <fstream>
    #include <ctime>
    
    class dxexception
    {
    private:
    	std::wstring errorLog{};
    	std::wofstream logFile{};
    
    public:
    	dxexception(const std::wstring& file, const std::wstring& func, const int line, const std::wstring& message) 
    		: errorLog{ file + L":" + func + L":" + std::to_wstring(line) + L":" + message + L"\n" }
    	{
    		std::time_t t{ std::time(nullptr) };
    		tm tbuf;
    		wchar_t wstr[100];
    		localtime_s(&tbuf, &t);
    		if (std::wcsftime(wstr, 100, L"%a %b %d %H:%M:%S %Y", &tbuf))
    		{
    			std::wstring dateTime{ wstr };
    			errorLog = L"[" + dateTime + L"] " + errorLog;
    		}
    		else
    			errorLog = L"[ --- ] " + errorLog;
    
    		this->logFile.open("log.txt", std::ios::app);
    
    		if (logFile.good())
    			this->logFile << this->errorLog;
    	}
    
    	dxexception(const dxexception&)
    	{
    	}
    
    	~dxexception()
    	{
    		this->logFile.close();
    	}
    
    	const std::wstring what() const
    	{
    		return this->errorLog;
    	}	
    };
    #endif
    

    Hier die Hauptprogrammdatei:

    #include <iostream>
    
    #include "dxexception.h"
    
    int main(int argc, char** argv)
    {
    	try
    	{
    		throw dxexception(ERRFILE, ERRFUNC, ERRLINE , L"Fatal Error!");
    	}
    	catch (dxexception& ex)
    	{
    		std::wcout << ex.what() << std::endl;
    	}
    }
    

    Ich würde mich sehr über den ein oder anderen Tipp freuen.

    Mit freundlichen Grüßen,

    Jan

    PS: Ich habe nach dem Fehler gegoogled aber so richtig schlau werde ich daraus aber nicht 😕 Ich könnte mir lediglich vorstellen, dass beim werfen der Ausnahme das Objekt kopiert wird, aber der Kopierkonstruktor gibt nichts aus selbst wenn ich eine Ausgabe implementiere auch eine Implementierung dxexception(const dxexception&) = Default bringt leider keine behebung des fehlers.



  • Tu den Destructor weg, dann generiert der Compiler einen defaulted Copy-Ctor und alles ist gut.



  • Es geht vielen Dank 😀

    Aber jetzt bin ich verwirrt, wie hängt der Destruktor in dem Kontext mit dem Kopierkonstruktor zusammen?

    Zugegeben evtl. sollte ich noch etwas in meiner C++ Bibel nachlesen dann würde sich das sicher klären. Aber anstatt etliche Seiten zu lesen würde es für den Moment ein kurzer Kommentar sicher auch tun um meine Verwirrtheit zu beseitigen^^



  • https://stackoverflow.com/a/24512883/3975177

    Seit IMHO C++11 sind die rot hinterlegten nicht mehr defaulted sondern deleted.



  • Danke für den Link, direkt unter Lesezeichen gepackt für die Zukunft 🙂

    Damit ist das Thema gelöst 😊



  • Was anderes. Ich finde nicht daß es Aufgabe einer Exception sein sollte auch selbst zu loggen.



  • Du möchtest mir vorschlagen die gesammelten Daten weiterzuleiten an eine Klasse die fürs loggen zuständig ist? Dann hätte ich zwei relativ kleine Klassen. Aber das klingt für mich ein wenig nach ner Mentalitätssache. Die einen machen es so, die anderen so.
    Aber Grundsätzlich kann ich dich verstehen. Wenn die log Funktionen mehr und größer werden kann ich den Sinn einer eigenen Klasse nachvollziehen. Bei Exception nun in der Vorlesung und in den Büchern waren die Aufgaben lediglich mitteilender Natur. Ich würde schon gerne wissen wie man Exceptions noch viel umfangreicher nutzen kann



  • @CAres91 sagte in Problem: Explizite Implementierung des Copyconstructors notwendig?:

    Aber das klingt für mich ein wenig nach ner Mentalitätssache. Die einen machen es so, die anderen so.

    Viele finden SOLID und davon das SRP richtigtm.



  • Danke 🙂 Noch mehr Input werde mir das zwischendurch mal zu Gemüte führen^^ Aber ich habe so eine Ahnung worauf das hinausläuft.^^


Log in to reply