2014-01-29 2 views
4

내 클래스에는 배열에 대한 고유 한 포인터가 들어 있습니다. 복사 생성자가 호출되면 클래스에 고유 한 포인터 배열을 만들고 이전 고유 포인터 배열의 내용을 복사하기를 원합니다. 나는 const 값으로부터 변환하는 것에 관한 에러를 계속 얻었고, 나는 그것을 둘러싼 방법을 잘 모르고있다.복사 생성자에서 고유 한 포인터 배열의 내용 복사

내 포인터가 다음과 같이 개인에서 선언

: 나는 배열을 그냥 루프를 계획

std::unique_ptr<Manager[]> managers; 

수동으로 복사, 그래서이 복사 생성자를 만들어 :

Restaurant::Restaurant(const Restaurant &_r) 
{ 
    Manager *_managers = _r.managers; 
    for (int i = 0; i < MAX_MANAGERS; i++) 
    { 
     managers.get()[i] = _managers[i]; 
    } 
} 

IT는 CONST를 제공합니다 이 줄의 오류를 변환하십시오 :

Manager *_managers = _r.managers; 

나는 단지 깊은 사본을 만들고 싶습니다. 어떻게하면이 일을 할 수 있습니까?

+1

'_r.managers'가 unique_ptr이 아닌가요? 그것을 다른 것에 할당 할 수는 없습니다. – juanchopanza

+1

또한 copy semantics를 원하면 unique_ptr을 사용해야하는 이유는 무엇입니까? 'std :: vector '이 더 적합하지 않겠는가? – juanchopanza

+0

그는 각 클래스 인스턴스가 unique_ptr을 어떤 배열에 갖기를 원합니다. 한 클래스에서 unique_ptr의 사용은 복사 금지를 의미합니까? 지적 된 객체가 실제로 유일하다면, 그는 shared_ptr을 만들고 싶지 않지만 여전히 클래스 인스턴스를 복사하려고합니다. – 4pie0

답변

3

가 컴파일되지 않습니다 이유는 _r.managers 유형 std::unique_ptr<Manager[]>의 것을,하지만 당신은 초기화 할 이것에 원시 포인터.

단지로 변경 :

Restaurant::Restaurant(const Restaurant &_r) 
{ 
    for (int i = 0; i < MAX_MANAGERS; i++) 
    { 
     managers.get()[i] = _r.managers.get()[i]; 
    } 
} 

또는 첫 번째 (배열 인)

Manager *_managers = _r.managers.get(); 

를 스마트 포인터의 데이터를 가지고 있었다으로 당신은 그것을 사용하기 전에 :

for (int i = 0; i < MAX_MANAGERS; i++) { 
     managers.get()[i] = _managers[i]; 
} 
+0

컴파일 할 수 있지만 할당시 응용 프로그램이 충돌합니다. _r이 있는지 확인하기 위해 값을 출력했지만 할당 시도시 충돌합니다. – Lucas

+0

아마 배열이 초기화되지 않았습니다. 이것을 확인하고 클래스 식당에 대한 대입 연산자도 씁니다. 이것은 필수입니다. (int i = 0; i 4pie0

+0

예, 배열을 초기화하는 것을 잊었으며 복사 할 클래스의 고유 포인터를 초기화하는 것을 잊었습니다. 나는 지금 일하고있다. 감사. – Lucas

1

오류가있는 행에서 managersstd::unique_ptr<Manager[]>입니다. Manager*에 할당하려고했으나 작동하지 않습니다.

당신은 예를 들어, unique_ptr의의 원시 포인터를 취함으로써 문제를 해결할 수 있습니다

Manager *_managers = _r.managers.get();