2012-07-17 2 views
2

C# 응용 프로그램을 C++로 포팅하고 Box가 구조체이고 BoxStore가 응용 프로그램의 전역 긴 수명 객체가됩니다.모범 사례 모음을 저장하는 방법

public class BoxStore 
{ 
    private List<Box> boxes; 

    ... 

    public List<Box> GetBoxes() 
    { 
     return this.boxes; 
    } 
} 

박스 컬렉션을 C++의 std :: vector에 저장할 계획입니다. 컬렉션을 정의하는 방법은 여러 가지가 있습니다.

std::vector<Box> boxes; 
shared_ptr<std::vector<Box>> boxes; 
std::vector<Box>& boxes; 
(*std::vector<Box> boxes;) 

무엇이 있습니까? - 가장 좋은 방법은 무엇입니까? 마지막 옵션 (컬렉션에 원시 포인터를 저장하는 것)은 아무런 이점도없는 최악의 해결책입니다 (따라서 괄호로 묶음).

그리고 GetBoxes 메서드를 이식하는 가장 좋은 방법은 무엇입니까? 물론 이것은 컬렉션을 저장하는 방법에 달려 있습니다. 나도 여기에 여러 방법을 볼 수

(std::vector<Box> GetBoxes();) 
std::shared_ptr<std::vector<Box>> GetBoxes(); 
*std::vector<Box> GetBoxes(); 
std::vector<Box>& GetBoxes(); 

첫 번째 솔루션은 잘못된 것 같다, 벡터가 돌아 오면 복사 될 것이기 때문에, 따라서 호출자가 원래의 콜렉션을 수정할 수 없습니다.
그러나 다른 세 가지 접근 방식은 나에게 똑같이 좋은 것처럼 보입니다. BoxStore 인스턴스는 오래 살며 앱이 실행되는 동안 파괴되지 않으므로 호출자는 컬렉션에 대한 소유권을 갖지 않습니다. 그렇다면 shared_ptr을 반환한다는 것은 의미 상 올바르지 않습니까? (BoxStore 객체는 항상 컬렉션을 해제합니다.)

그리고 원시 포인터 또는 참조를 반환하는 데는 상당한 차이가 있습니까?

+0

두 가지 가능한 방법이 없습니다. 그들은 심지어 컴파일도하지 않습니다. –

+2

컬렉션 (옵션 1)을 저장하고 참조 (옵션 4)를 반환하십시오. 상점이'vector'를 소유하고 있다면, 포인터로 귀찮게해서는 안됩니다. 물론 컴파일 할 때 앰퍼샌드를 올바른 위치로 옮겨야합니다. – dasblinkenlight

+0

수정 해 주셔서 감사합니다. 게시하기 전에 코드를 컴파일하지 않았습니다. –

답변

1

이것은 당신이 찾고있는 가능한 것일 수 있습니다. BoxStore가 실제로 개체를 소유하고 있습니다. 따라서, 포인터 등은 필요하지 않습니다. 개별 상자 개체 및 목록 은 Store보다 오래 지속되지 않는다고 가정합니다. 그런 요구 사항이 있으면 포인터 사용을 고려해야 할 수도 있습니다.

참조에 의한 반품은 이므로 캡슐화에 위배됩니다.. 따라서 클라이언트가 목록을 수정할 수 있도록하는 제약 조건이 없다면 목록 사본을 제공해야합니다.

#include <list> 

class Box 
{ 
... 
}; 

class BoxStore 
{ 
private : 
    std::list<Box> boxes; 

public : 
    std::list<Box>& GetBoxes() 
    { 
     return boxes; 
    } 
} 
+0

답변 주셔서 감사합니다. 네가 맞아, 상자 개체 (실제로는 가벼운 데이터 전송 개체) 및 컬렉션 저장소를 오래 살지 않습니다. –