문제

인터페이스 객체에 대한 (스마트가 아닌) 포인터가있는 클래스가 있으며 (Pinterface라고 부르겠습니다) 해당 인터페이스에 액세스 해야하는 중첩 클래스를 구축하고 있습니다. 인터페이스에 대한 포인터를 중첩 클래스의 생성자로 전달하여 다음과 같이이 문제를 해결할 것입니다.

CNestedClass someClass( pInterface, ... );

그러나이 포인터를 중첩 클래스에 저장하는 가장 좋은 방법은 확실하지 않습니다. 나는 사용할 수있다 :

1) A scoped (or other smart) pointer (to the original object)
2) A pointer to a pointer 

너희들은 무엇을 제안하고 그 이유는 무엇입니까?

편집 : 명확히해야합니다 - 중첩 클래스는 인터페이스 객체에서 메소드를 호출해야하지만,이를 생성하지 않거나 '지적 된 개체를 수정하지 않음). 부모 클래스는 이에 대한 책임이 있습니다.

도움이 되었습니까?

해결책

포인터에 대한 포인터 사용은 어느 클래스 중 하나가 기존 객체를 삭제하고 새 객체로 교체하여 포인터의 값을 변경할 수있는 경우입니다. 이를 통해 두 클래스 모두 포인터 투 포인터를 비교하여 동일한 객체를 사용할 수 있습니다.

우려하지 않으면 두 클래스의 수명 내내 객체가 유효한 상태를 유지하는 것입니다.

  • 중첩 계급이 더 짧아지면 실제로 걱정할 필요가 없습니다.
  • 동일하다면 올바른 순서로 정리하는 경우 (예 : 중첩 클래스, 나중에 개체) 다시 다시 한 번 걱정할 필요가 없습니다.
  • 소유자가 파괴 된 후 중첩 클래스가 지속될 수 있다면 객체도 지속되도록하는 방법을 구현해야합니다.

객체의 수명을 보장 해야하는 경우 수동으로 또는 스마트 포인터 인터페이스를 통해 참조 계산-내성을 통해 수행 할 수 있습니다.

스마트 포인터의 경우 boost :: shared_ptr가 좋은 선택이 될 것입니다. shared_ptr을 사용하면 객체의 소유권이 공유 금액 여러 포인터가 될 수 있습니다. 마지막 shared_ptr가 범위를 벗어나면 객체가 삭제됩니다.

(이것은 객체가 독점적으로 소유되는 auto_ptr의 경우가 아닙니다).

알아야 할 것들;

  1. boost를 사용할 때 :: shared_ptr 중첩 클래스에 복사 참조/포인터가 아닌 shared_ptr의.
  2. std :: auto_ptr는 상당히 다르게 행동하며 객체는 독점적으로 소유되고 공유되지 않습니다.
  3. boost :: shared_ptr는 힙 객체와 만 작동 할 수 있습니다.

예시:

typedef boost::shared_ptr<Interface> shared_interface;

class NestedClass
{
  shared_interface mInterface; // empty pointer
}

void NestedClass::setInterface(shared_interface& foo)
{
  mInterface= foo; // take a copy of foo.
}

void ParentClass::init( void )
{
  // mInterface is also declared as shared_interface
  mInterface = new Interface();
  mNestedClass->setInterface(mInterface);
}

다른 팁

포인터에 대한 포인터를 사용하려는 다른 이유는 밖의 코드는 원래 포인터 값을 변경할 수 있습니다 (예 : 새 개체를 가리 키거나 가리키는 객체를 풀고 나면 널로 설정). 그러나 IMO는 다른 사람에게 포인터를 바친 후 포인터를 바꾸는 것이 매우 나쁜 관행입니다.

따라서 외부 코드 나 중첩 클래스가 포인터를 변경하지 않으면 중첩 클래스에 원래 포인터의 사본으로 멤버 변수 (필드)로 저장하십시오.

인터페이스 (iMyinterface ** ppinterface)에 대한 포인터 주소를 전달하고 클래스에서 구현 된 경우 포인터를 채우십시오.

클래스는이 포인터를 해당 인터페이스에 시전하고 포인터 *ppinterface를 채울 수 있습니다. 클래스 가이 인터페이스를 구현하지 않으면 *ppinterface를 null로 설정할 수 있습니다.

기본적으로 두 개의 다른 객체 사이에서 동일한 객체에 대한 포인터를 공유하고 있습니다. 스마트 포인터를 사용하지 않는 경우 공유 객체에 포인터를 저장하십시오. 공유 객체의 소유권, 즉 공유 객체를 거래하고 다른 사람들에게 사라 졌음을 알리는 객체의 소유권에주의해야합니다.

class Outer
{
    class Inner
    {
    };
};

외부의 객체는 Pinterface 객체에 대한 원시 포인터 만 보유하고 있습니다. 이는 외부 객체가 Pinterface 객체의 수명을 소유하지 않거나 제어 할 수 없음을 의미합니다. 그러므로 우리는 Pinterface 객체가 외부 물체만큼 오래 살 것이라는 보장이 있기를 바랍니다. 이 경우 포인터를 사용할 이유가 없습니다. 참조 만 사용할 수 있습니다 (Pinterface가 Null이 될 상황이 없다고 가정 함).

내부가 어떻게 '참조'(C ++ 참조가 아님)를 보유하는 방법 (C ++ 참조)에 따라 달라지며 실제로 관련된 물체 간의 관계에 대한 자세한 정보가 필요합니다!

  • 내부와 외부 물체 사이의 실현은 무엇입니까?
  • Pinterface 포인터를 물려받은 외부 물체와 관련하여 내부 물체의 수명은 얼마입니까?
  • 외부 물체가 Pinterface 객체보다 수명이 짧다는 보장은 무엇입니까?

등.

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