Tiled의 XML 파일을 읽을 프레임 워크를 만들고 결과 객체 (tpp :: File)는 순수 변경 불가능 (설정자 또는 복사 생성자/할당 연산자 없음)됩니다. 기본적으로 종류는 builder pattern 아이디어를 사용하지만 동일한 속성을 가진 두 개의 객체가있는 대신 주 속성과 객체를 "포장"합니다.변경 불가능한 클래스 및 복사 생성자
// 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;
};
그런 다음, 어딘가에 파일 생성 과정에서, 우리는이있을 것이다 : 예상대로 위의 코드 조각의 File(const tpp::Path& path, tpp::FileMetadata& metadata)
생성자를 사용합니다
tpp::File FileReader::read(const std::string& path)
{
tpp::FileMetadata metadata = m_parser.parseMetadata(path);
return tpp::File(path, metadata);
}
. 그러나 우리가 tpp :: File의 tpp :: FileMetadata const를 만들면 이 대신 File(const tpp::File&)
생성자를 사용하려고 시도합니다. 왜 그런 일이 일어날까요?!
프로젝트를 참조하려면 here을 참조하십시오. 어떤 생각도 매우 높이 평가됩니다. 그것은 File(const tpp::File&)
생성자를 사용하려고합니다
안녕하세요, @Yakk! 답장을 보내 주셔서 감사합니다! 이걸 제게 알려주십시오.'FileMetaData는 FileMetadata const &&에서의 이동을 지원하지 않습니다. 따라서 File (File &&)의 your = default는 작동하지 않습니다; 기본 구현이 효과가 없다 .' 또한 move-from에 대한 "추가 지원"은 move constructor/assigment 연산자를 * 삭제할 필요가 있습니까? –
@YvesHenri "지원 추가"는 어디에서 볼 수 있습니까? 누구를 인용하고 있습니까? 디자인에서 이동 시작을 지원할 수 없습니다. 당신은 불변성을 원한다. 당신은 움직일 수 없다. 이동 지원에 대한 초기 의견은 당신을 추론하여 * 지원을 원합니다. 나는 그저 네가 가질 수 없다고 진술한다. '= default'는 실제로 그것들을 구현하지 않았습니다; 그래서 나는 그것이'= delete'd라는 것을 명시했다. 그런 다음 return 문을 반환 값으로 이동하는 대신 내부에서 생성하도록 변경했습니다. 마지막 줄 앞에 설명 할 때 심각한 제한이 있습니다. 마지막 라인이 끝나면, "글쎄, 여기 또 다른 해결책이있다."라고 말합니다. – Yakk