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 객체는 항상 컬렉션을 해제합니다.)
그리고 원시 포인터 또는 참조를 반환하는 데는 상당한 차이가 있습니까?
두 가지 가능한 방법이 없습니다. 그들은 심지어 컴파일도하지 않습니다. –
컬렉션 (옵션 1)을 저장하고 참조 (옵션 4)를 반환하십시오. 상점이'vector'를 소유하고 있다면, 포인터로 귀찮게해서는 안됩니다. 물론 컴파일 할 때 앰퍼샌드를 올바른 위치로 옮겨야합니다. – dasblinkenlight
수정 해 주셔서 감사합니다. 게시하기 전에 코드를 컴파일하지 않았습니다. –