Ich mache ein Framework, das eine XML-Datei Tiled lesen wird und das resultierende Objekt (tpp :: File) wird unveränderlich (keine Setter oder Kopie Konstruktoren/Zuweisungsoperatoren). Im Grunde verwendet es die builder pattern Idee, aber anstatt 2 Objekte mit den gleichen Attributen zu haben, werde ich eins mit den Hauptattributen haben und ein anderes, das es "wickeln" wird.Unveränderliche Klassen und Kopierkonstruktoren
// Represents a Tiled's TMX file. This object is immutable.
class TILEDPP_API File final
{
public:
File() = default;
File(tpp::File&&) = default;
File(const tpp::File&) = delete;
File(const tpp::Path& path, tpp::FileMetadata& metadata);
File& operator = (tpp::File&&) = default;
File& operator = (const tpp::File&) = delete;
const tpp::Path& getPath() const;
const tpp::Header& getHeader() const;
const tpp::Layers& getLayers() const;
const tpp::TileSets& getTileSets() const;
private:
const tpp::Path m_path;
tpp::FileMetadata m_metadata; // Should be const!
};
// Represents the content of a Tiled's TMX file (header, sets, layers etc).
// This struct is non-copyable due to its HUGE size.
struct TILEDPP_API FileMetadata final
{
FileMetadata() = default;
FileMetadata(tpp::FileMetadata&&) = default;
FileMetadata(const tpp::FileMetadata&) = delete;
FileMetadata& operator = (FileMetadata&&) = default;
FileMetadata& operator = (const FileMetadata&) = delete;
tpp::Header header;
tpp::Layers layers;
tpp::TileSets sets;
};
Dann irgendwo in der Datei Erstellungsprozess, werden wir dieses:
tpp::File FileReader::read(const std::string& path)
{
tpp::FileMetadata metadata = m_parser.parseMetadata(path);
return tpp::File(path, metadata);
}
Die obige Snippet den File(const tpp::Path& path, tpp::FileMetadata& metadata)
Konstruktor wird, wie erwartet. Jedoch, wenn wir tpp :: File tpp :: FileMetadata const machen, wird es versuchen, stattdessen den File(const tpp::File&)
Konstruktor zu verwenden, der gelöscht ist. Warum passiert es überhaupt ?!
Als Referenz kann das Projekt here gefunden werden. Alle Gedanken werden auch sehr geschätzt.
Hallo, @Yakk! Danke für deine Antwort! Könnten Sie mich bitte aufklären: 'FileMetaData unterstützt keine Verschiebung von FileMetadata const &&). So funktioniert Ihr = Standard in Datei (Datei &&) nicht; keine Standardimplementierung kann funktionieren. Wie fügt "Unterstützung hinzufügen" für move-from hinzu, dass * der Move-Konstruktor/-Assigment-Operator * gelöscht * wird? –
@YvesHenri Wo hast du "Unterstützung hinzufügen" gesehen? Wen zitierst du? Dein Entwurf kann den Umzug nicht unterstützen. Du willst Unbeweglichkeit, du kannst keine Unterstützung haben. Die ersten Kommentare über die Unterstützung von move sagen mir, dass du * Unterstützung * verschieben willst; Ich behaupte einfach, dass du es nicht haben kannst. Das '= default' implementierte sie nicht; also habe ich explizit gesagt, dass es "= löschen" war. Ich habe dann die return-Anweisung geändert, um in-place zu erstellen, anstatt in den Rückgabewert zu wechseln. Dies hat gravierende Einschränkungen, wie ich vor der letzten Zeile beschrieben habe. Nach der letzten Zeile sage ich "nun, hier ist eine andere Lösung". – Yakk