생성자에서 const 멤버 개체 역 직렬화

멘탈 버섯

생성자에서 클래스의 const 멤버 개체를 초기화해야하지만 멤버의 생성자는 빈 개체 만 생성하는 반면 실제 초기화는 파일에서이 개체를 역 직렬화하여 수행해야합니다. 멤버 개체의 클래스는 내 것이 아니므로 변경할 수 없습니다. 즉, Dlib 모델이며 다음 코드는 동작을 시뮬레이션합니다.

#include <iostream>
#include <string>

// not my class, can't be changed
class ShapePredictor 
{
    friend std::istream& operator >> (std::istream& stream, ShapePredictor&);

public:
    ShapePredictor() = default;
    ShapePredictor(const ShapePredictor& other) : data(other.data) { std::cout << "copy" << std::endl; }
    ShapePredictor(ShapePredictor&& other) : data(std::move(other.data)) { std::cout << "moved" << std::endl; }
private:
    std::string data;
};

// deserialization 
std::istream& operator >> (std::istream& stream, ShapePredictor& sp)
{
    sp.data = "test33";
    return stream;
}

class FaceExtractor
{
public:
    FaceExtractor()
    {
        std::cin >> this->sp;       // won't compile        
    }

private:
    const ShapePredictor sp;
};

int main(int argc, char* argv[])
{
    FaceExtractor extractor;
    return 0;
}

최선의 방법이 무엇인지 잘 모르겠습니다. 가장 먼저 떠오르는 것은 다음을 사용하는 것입니다 const_cast<>().

class FaceExtractor
{
public:
    FaceExtractor()
    {
        std::cin >> const_cast<ShapePredictor&>(this->sp);
    }

private:
    const ShapePredictor sp;
};

작동하지만 사용 const_cast<>()은 일반적으로 나쁜 습관으로 간주됩니다. 나는 그것이 대부분 const 정확하지 않은 레거시 API와의 호환성을 위해 설계되었다고 읽었습니다. 제 경우에 사용하는 것이 괜찮을지 잘 모르겠습니다.

이 문제를 해결하는 또 다른 방법 deserialize()은 클래스를 임시 객체에로드하고 반환 하는 멤버 함수를 만드는 것입니다.

class FaceExtractor
{
public:
    FaceExtractor()
        : sp(deserialize())
    {   }

    ShapePredictor deserialize()
    {
        ShapePredictor tmp;
        std::cin >> tmp;
        return tmp;
    };

private:
    const ShapePredictor sp;
};

여기에는 바람직하지 않은 임시 생성이 포함됩니다. 바라건대 NRVO는 사본을 제거하지만 MSVC에서는 여전히 한 번의 추가 이동 비용이 듭니다.

그런 종류의 객체를 초기화하는 일반적인 관행이 무엇인지 궁금합니다.

테드 링모

멤버 변수를 비 const. const멤버 변수 를 갖는 것은 일반적으로 고통스럽고 거의 유용하지 않습니다.

반드시 있어야한다면 const에서 상속하는 클래스를 만들고 ShapePredictor스트리밍을 수행하는 생성자를 추가 할 수 있습니다.

struct ShapePredictorStreamable : public ShapePredictor {
    ShapePredictorStreamable(std::istream& is) {
        is >> *this;
    }
};

class FaceExtractor {
public:
    FaceExtractor() : sp(std::cin) {}

private:
    const ShapePredictorStreamable sp;
};

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

WebSocketSubject에서 Blob 개체 역 직렬화

분류에서Dev

C #에서 JSON 개체 역 직렬화

분류에서Dev

XML에서 개체 역 직렬화로

분류에서Dev

RMI를 통해 역 직렬화 된 개체로 서버 개체 업데이트

분류에서Dev

MongoDb + C #에서 기본 생성자없이 개체 역 직렬화

분류에서Dev

JSON을 .NET 개체로 역 직렬화하면 개체의 각 멤버에 null이 추가됩니다. 이유는 무엇입니까?

분류에서Dev

C # 단일 개체에서 두 Jarray 개체 역 직렬화

분류에서Dev

Java의 개체 내에서 일반 개체 역 직렬화

분류에서Dev

JSON 개체 역 직렬화

분류에서Dev

Kafka 소비자에서 Java 개체 역 직렬화

분류에서Dev

JSON 문자열에서 선택한 JSON 개체 역 직렬화

분류에서Dev

XML 역 직렬화로 인해 빈 개체가 생성됨

분류에서Dev

XML 역 직렬화로 인해 빈 개체가 생성됨

분류에서Dev

C # / JSON 개체 직렬화, 역 직렬화 및 대 / 소문자 문제 없음

분류에서Dev

빈 개체 "{}"로 문자열 속성 역 직렬화

분류에서Dev

Swift3에서 객체의 직렬화 및 역 직렬화

분류에서Dev

WebAPI-서버 측에서 올바르게 역 직렬화되지 않는 개체 배열

분류에서Dev

JAXB 역 직렬화를 통한 개체 생성 사용자 지정

분류에서Dev

json에서 RecognizedForm 개체 역 직렬화 (Azure Form Recognizer Python SDK)

분류에서Dev

(역) C #에서 변경된 개체의 직렬화

분류에서Dev

COM을 사용하여 PHP에서 .Net 개체 역 직렬화

분류에서Dev

C #에서 XML을 개체로 역 직렬화하는 방법

분류에서Dev

JSON.NET에서 인터페이스 개체 역 직렬화

분류에서Dev

C #에서 JSON 역 직렬화 : 개체 대 배열

분류에서Dev

DataContractSerializer를 사용하여 개체에서 XML 역 직렬화

분류에서Dev

일반 객체를 문자열로 직렬화 / 역 직렬화

분류에서Dev

C ++ 멤버 초기화에서 생성자에 새 개체 전달

분류에서Dev

parse.com : SerializationException "__type"속성으로 JSON 개체 역 직렬화

분류에서Dev

json 문자열을 .NET 개체 목록으로 역 직렬화

Related 관련 기사

  1. 1

    WebSocketSubject에서 Blob 개체 역 직렬화

  2. 2

    C #에서 JSON 개체 역 직렬화

  3. 3

    XML에서 개체 역 직렬화로

  4. 4

    RMI를 통해 역 직렬화 된 개체로 서버 개체 업데이트

  5. 5

    MongoDb + C #에서 기본 생성자없이 개체 역 직렬화

  6. 6

    JSON을 .NET 개체로 역 직렬화하면 개체의 각 멤버에 null이 추가됩니다. 이유는 무엇입니까?

  7. 7

    C # 단일 개체에서 두 Jarray 개체 역 직렬화

  8. 8

    Java의 개체 내에서 일반 개체 역 직렬화

  9. 9

    JSON 개체 역 직렬화

  10. 10

    Kafka 소비자에서 Java 개체 역 직렬화

  11. 11

    JSON 문자열에서 선택한 JSON 개체 역 직렬화

  12. 12

    XML 역 직렬화로 인해 빈 개체가 생성됨

  13. 13

    XML 역 직렬화로 인해 빈 개체가 생성됨

  14. 14

    C # / JSON 개체 직렬화, 역 직렬화 및 대 / 소문자 문제 없음

  15. 15

    빈 개체 "{}"로 문자열 속성 역 직렬화

  16. 16

    Swift3에서 객체의 직렬화 및 역 직렬화

  17. 17

    WebAPI-서버 측에서 올바르게 역 직렬화되지 않는 개체 배열

  18. 18

    JAXB 역 직렬화를 통한 개체 생성 사용자 지정

  19. 19

    json에서 RecognizedForm 개체 역 직렬화 (Azure Form Recognizer Python SDK)

  20. 20

    (역) C #에서 변경된 개체의 직렬화

  21. 21

    COM을 사용하여 PHP에서 .Net 개체 역 직렬화

  22. 22

    C #에서 XML을 개체로 역 직렬화하는 방법

  23. 23

    JSON.NET에서 인터페이스 개체 역 직렬화

  24. 24

    C #에서 JSON 역 직렬화 : 개체 대 배열

  25. 25

    DataContractSerializer를 사용하여 개체에서 XML 역 직렬화

  26. 26

    일반 객체를 문자열로 직렬화 / 역 직렬화

  27. 27

    C ++ 멤버 초기화에서 생성자에 새 개체 전달

  28. 28

    parse.com : SerializationException "__type"속성으로 JSON 개체 역 직렬화

  29. 29

    json 문자열을 .NET 개체 목록으로 역 직렬화

뜨겁다태그

보관