Von std::string Klasse ableiten?



  • Hallo, ich habe mir mit VS Code unter Windows folgende Klasse programmiert.

    #pragma once
    
    #include <map>
    #include <string>
    
    namespace StdLibs
    {
    	class String : public std::string
    	{
    		public:
    			String() = default;
    			String(const String& _string) = default;
    			String(String&& _string) = default;
    			String(const char* _string);
    			String(const unsigned long _value);
    			String(const std::size_t _value);
    
    			String(const char* _string, const char* _placeHolder, const char* _replacementString);
    			String(const char* _string, const char* _placeHolder, const unsigned long _value);
    			String(const char* _string, const char* _placeHolder, const std::size_t _value);
    
    			String(const char* _string, const std::map<std::string, std::string>& _placeHoldersAndReplacementStrings);
    
    			virtual ~String() = default;
    
    			String& operator=(const String& _string) = default;
    			String& operator=(String&& _string) = default;
    
    			virtual void replacePlaceHolder(const std::map<std::string, std::string>& _placeHoldersAndReplacementStrings);
    			virtual void replacePlaceHolder(const std::string& _placeHolder, const std::string& _replacementString);
    	};
    }
    

    Lässt sich ohne Fehler bauen (MinGW). Wenn ich diese Klasse versuche unter Ubuntu zu bauen, bekomme ich folgende Fehler:

    g++ -g3 -O0 -Wall -Wextra -std=c++17 -c "exception.cpp" -o "debug/exception.o"
    g++ -g3 -O0 -Wall -Wextra -std=c++17 -c "reference.cpp" -o "debug/reference.o"
    g++ -g3 -O0 -Wall -Wextra -std=c++17 -c "string.cpp" -o "debug/string.o"
    In file included from string.cpp:1:0:
    string.hpp:16:4: error: ‘StdLibs::String::String(std::size_t)’ cannot be overloaded
    String(const std::size_t _value);
    ^~~~~~
    string.hpp:15:4: error: with ‘StdLibs::String::String(long unsigned int)’
    String(const unsigned long _value);
    ^~~~~~
    string.hpp:20:4: error: ‘StdLibs::String::String(const char*, const char*, std::size_t)’ cannot be overloaded
    String(const char* _string, const char* _placeHolder, const std::size_t _value);
    ^~~~~~
    string.hpp:19:4: error: with ‘StdLibs::String::String(const char*, const char*, long unsigned int)’
    String(const char* _string, const char* _placeHolder, const unsigned long _value);
    ^~~~~~
    string.cpp:27:2: error: redefinition of ‘StdLibs::String::String(std::size_t)’
    String::String(const std::size_t _value)
    ^~~~~~
    string.cpp:12:2: note: ‘StdLibs::String::String(long unsigned int)’ previously defined here
    String::String(const unsigned long _value)
    ^~~~~~
    string.cpp:71:2: error: redefinition of ‘StdLibs::String::String(const char*, const char*, std::size_t)’
    String::String(const char* _string, const char* _placeHolder, const std::size_t _value)
    ^~~~~~
    string.cpp:55:2: note: ‘StdLibs::String::String(const char*, const char*, long unsigned int)’ previously defined here
    String::String(const char* _string, const char* _placeHolder, const unsigned long _value)
    ^~~~~~
    makefile:4: recipe for target 'debug.all' failed
    make: *** [debug.all] Error 1
    The terminal process terminated with exit code: 2

    Terminal will be reused by tasks, press any key to close it.

    Ich stehe gerade ein bisschen auf dem Schlauch. Warum sollte ich die Konstrukturen nicht überschreiben dürfen? Bzw. wieso kann ich keine eigenden Konstruktoren implementieren?

    Torsten



  • string.cpp:27:2: error: redefinition of ‘StdLibs::String::String(std::size_t)’
    String::String(const std::size_t _value)

    Die Signaturen im Header und cpp sollten gleich aussehen.



  • Die Fehler kommen daher, daß unsigned long und std::size_t als gleicher Datentyp angesehen werden und daher keine Überladung möglich ist.

    Generell ist es aber keine gute Idee von std::string (und anderen Klassen der C++ Standard Library) abzuleiten, da diese keinen virtuellen Destruktor bereitstellen.



  • @Th69 Danke dafür 🙂


Log in to reply