0

여기 내 코드입니다 (표준 : : 문자열) 새로운 내부 배치를 가지고 클래스에 대한 안전 복사 생성자를 구현 : 사례를 적절하게 처리하는 복사 생성자를 추가하는 방법에 대한어떻게

struct RS_Token 
{ 
    char id; 
    char cleanup; 
    unsigned char array[sizeof (std::string) > sizeof (double) ? sizeof (std::string) : sizeof (double)]; 

    RS_Token(int a) : 
     id(a), 
     cleanup(0) 
    { 
    } 
    RS_Token(int a, const char* pstr) : // identifier or text 
     id(a), 
     cleanup(1) 
    { 
     new (array) std::basic_string<unsigned char>((unsigned char*)pstr); 
    } 
    RS_Token(int a, int b) : // integer 
     id(a), 
     cleanup(0) 
    { 
     new (array) int(b); 
    } 
    RS_Token(int a, double b) : // float (double) 
     id(a), 
     cleanup(0) 
    { 
     new (array) double(b); 
    } 

    ~RS_Token() 
    { 
     if (cleanup) 
     { 
      std::basic_string<unsigned char>* p = reinterpret_cast<std::basic_string<unsigned char>*>(array); 

      p->~basic_string(); 
     } 
    } 
}; 

어떤 제안 어디 std :: string 내부적으로 할당되었습니다, 감사하겠습니다.

+4

별도의'표준 : string'와'double' 변수를 만드는 잘못 무엇입니까? 당신이 가지고있는 코드는 다른 것들 중에서 [심각한 정렬 문제] (http://www.gotw.ca/gotw/028.htm)를 가지게 될 것입니다. 그리고 그것들을 별도의 멤버 변수로 만들면 컴파일러에서 생성 한 복사본 생성자가 올바른 일을합니다. –

+0

Placement-new는 일반적으로'void *'인수를 취하므로 지루한 캐스트를 스스로 해결할 수 있습니다. –

+0

아마도 boost :: variant '이 이러한 일을 처리 할 것입니다. – visitor

답변

1

나는 당신이하고있는 것은 모두 좋은 디자인에 있는지 모르겠지만,에 대한 귀하의 질문에 대답하는 위치 새로운 : 당신은 다른 모든 new 표현처럼 생성자 인수를 제공

typedef std::basic_string<unsigned char> ustring; 

RS_Token(const char* pstr) 
{ 
    void * p = static_cast<void*>(array); 
    new (p) ustring(pstr, pstr + std::strlen(pstr)); 
} 

복사 - 구조 :

RS_Token(const RS_Token & other) 
{ 
    void * p = static_cast<void*>(array); 
    new (p) ustring(*reinterpret_cast<const ustring *>(other.array)); 
} 
,691 새로운 캐릭터를 구축

지정 :

RS_Token & operator=(const RS_Token & other) 
{ 
    ustring & s = *reinterpret_cast<ustring *>(array); 
    s = *reinterpret_cast<const ustring *>(other.array); 
    return this; 
} 
+0

복사 생성자는 다른 하나가 문자열을 포함하고 할당 연산자가 _both_가 이미 문자열이라고 가정하면 작동합니다. 그것들은 그것보다 조금 더 복잡 할 필요가 있습니다. –

+0

@Moo : 아, 네, 변형 논리의 좋은 양을 여기에 추가해야합니다. 그러나 대답은 배치 구성을 처리하는 것에 관한 것이므로 OP가이를 클래스 코드에 통합 할 수 있기를 바랍니다. –

+0

어, 사실입니다. 너는 모든 단단한 부분을 가지고있다. 나머지는 상당히 분명해야합니다. –