문제

나는 최근에 게시된 이 질문 에 DAL 디자인이다.에서 그것은 보이는 것이 전달하는 개체에 대한 참조로 기능으로,다음 기능을 채우는 개체의 좋은 인터페이스를 위한 C++데이터 액세스를 레이어,예를 들어,

  bool DAL::loadCar(int id, Car& car) {} 

나는 지금은 궁금을 사용하는 경우 참조 부스트::shared_ptr 더 나을 것이,예를 들어,

  bool DAL::loadCar(int id, boost::shared_ptr<Car> &car)

어떤 생각?중 하나에 비해 더 많은 이점을 제공합니까?

어떤 것의 의미를 적용하 const 정확성을 모니다.

미리 감사드립니다.

도움이 되었습니까?

해결책

sbi 은 말한다,"그것이 무엇에 따라 달라집 기능 않습니다."

그러나 제가 생각하는 가장 중요한 측면 위의 여부 NULL 은 허용되지 않았거나,그러나 기능 저장소의 포인터를 객체로 나중에 사용할 수 있습니다.는 경우 기능을 채우에는 일부 데이터가 사용하는 것에 대한 참조 다음과 같은 이유:

  • 기능 여전히 사용할 수 있습으로 클라이언트를 사용하지 않는 shared_ptr,사용에 대한 개체 스택,등등.
  • 를 사용하는 기능으로 shared_ptr 는 여전히 사소한-shared_ptr 는 역참조 연산자를 반환하는 참조
  • NULL 이 전달되지 않은 가능
  • 적은 입력
  • 내가 좋아하지 않을 사용하여"재료 할 때"내가 없

는 경우 기능을 저장할 필요가 있는 포인터를 위한 나중에 사용 또는 당신이 예상하는 기능에서 변경될 수 있습니다 그런 방법이 필요를 저장하는 포인터,다음 사용하 shared_ptr.

다른 팁

함수가 무엇을하는지에 따라 다릅니다.

일반적으로 포인터를 취하는 함수는 발신자가 전달할 객체가 없어도이 기능을 호출 할 수 있음을 나타냅니다. 항상 통과 할 수 있습니다. NULL. 함수의 사양에 맞는 경우 (스마트) 포인터를 사용하십시오. 참조를 참조하여 참조 카운트를 통과하는 대신 참조를 복사하는 대신 최적화 (조기가 아님)는 MT 환경에서 눈에 띄는 성능이 발생할 수있는 참조 수를 늘리고 감소시키는 것을 피하기 때문에 최적화 (조기에 추가해야합니다)입니다.

인수로서 정의되지 않은 참조를 취하는 함수는 변경 될 수있는 유효한 객체가 전달 될 것으로 예상됩니다. 발신자는 유효한 개체가 없으면 (법적으로) 해당 기능을 호출 할 수 없으며 기능이 객체의 상태를 변경하지 않으면 호출하지 않습니다. 함수의 사양에 더 잘 맞는 경우 참조를 사용하십시오.

유효한 객체를 받아야하는 경우 (즉, 발신자가 NULL을 통과하는 것을 원하지 않음), Boost :: shared_ptr을 사용하지 마십시오. 두 번째 예제는 "스마트 포인터"에 대한 참조를 전달합니다 .... 세부 사항을 무시하면 "자동차에 대한 포인터를위한 포인터"입니다. 참조이기 때문에 shared_ptr 객체는 null이 될 수 없습니다 ... 그러나 그것은 널 값을 가질 수 없다는 것을 의미하지는 않습니다 (즉, "null"객체를 가리 킵니다).

스마트 포인터에 대한 참조가 "더 나은"것이라고 생각하는 이유를 정확히 이해하지 못합니다. 발신자 기능은 이미 스마트 포인터를 사용합니까?

"const"의 의미에 관해서는 ... 당신은

bool DAL::loadCar(int id, const Car& car) {}

? 그렇다면 비생산적이면 "자동차"가 변하지 않는다는 사실을 컴파일러에게 전달합니다 (그러나 아마도 변경하기를 원할 것입니다!).

아니면 기능을 "const"로 만드는 것을 의미합니까?

class DAL{
   bool loadCar(int id, Car& car) const;
}

?

후자의 경우, "loadcar"메소드가 DAL 객체를 수정하지 않는다는 컴파일러/API 사용자와 통합됩니다. 이것이 사실이라면 그렇게하는 것이 좋습니다. 일부 컴파일러 최적화를 가능하게 할뿐만 아니라 일반적으로 "계약"(함수 서명)에서 함수가 DAL을 수정하지 않도록하는 것이 일반적으로 좋습니다. 당신은 당신의 코드 에서이 암시 적 가정을합니다 (이 방법으로 당신은 이것이 사실을 유지하고 앞으로 아무도 "dal"객체를 변경하는 방식으로 "loadcar"기능을 수정하지 않도록합니다).

첫 번째 경우에는 단순히 자동차를 전달하고 정보로 "채우십시오". 예를 들어, "기본"차량을 생성 한 다음 채울 수 있습니다. 나는 이것에서 하나의 불편 함을 본다. 하나의 가난한, 기본, 쓸모없고, "빈"자동차, 그리고 하나는 기능에서 나온 후에 진정으로 채워진 두 개의 자동차를 갖는 것은 그리 불편하지 않다. 나에게, 자동차는 자동차이므로, 유효한 자동차 (예 : 위치 A에서 B로 운전할 수 있습니다. 예를 들어, 제 브레이크, 시작, 중지 할 수있는 위치 A).

나는 일반적으로 전통적인 포인터와 함께 (문제없이) 부스트가 아닌 전통적인 포인터와 함께 일하면서 후자의 대안에 대해 실제로 언급 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top