나는 이것을 이해할 수 없다. 내가 간단한 것을 놓치고있는 것처럼 보인다고? 나는이 시점에서 그렇게 MakePointToSameValue
그에 넣어 무엇을 (1)
shared_ptr의 복사본을 다른 shared_ptr과 동일하게 만드는 방법은 무엇입니까?
- 즉 a.ptr
- 과 동일한에게 모두 b.ptr 및 c.ptr 점은
a.ptr.get() == b.ptr.get() == c.ptr.get()
- 값은 원래 지적 b.ptr에 의해 c.ptr이 삭제됨
? 그것은 C를 변경하지 않기 때문에, 작동하지 않습니다 PTR 복사
struct Test
{
public:
Test(int val) :
ptr(std::make_shared<int>(val))
{
}
void MakePointToSameValue(Test& other)
{
//what do I put here?
//other.ptr = this->ptr; //doesn't do it
}
private:
std::shared_ptr<int> ptr;
};
Test a(0);
Test b(5);
Test c(b);
b.MakePointToSameValue(a);
//(1)
은 (물론, c.ptr는이 refcount는 하나 감소 것있다). 단순함을 위해서 int
을 사용하고 있지만 복사 불가능한 유형에서는 작동해야합니다.
왜? 필자는 일종의 컴파일러에서 사용할 값, 모든 유형의 값을 나타내는 클래스를 보유하고 있습니다. 실제 값이나 저장 방법은 인스턴스화 될 때 알려집니다. 알려진 유일한 유형입니다. 따라서 클래스는 나중에 결정되는 값에 대한 자리 표시자를 포함하는 shared_ptr을 저장합니다 (포인터 또는 참조로 전달 될 때 함수 정의의 인수를 컴파일하는 것에 해당 : 컴파일러는 형식 만 알고, 그 이상은 없습니다). 런타임에는 자리 표시자를 실제 값으로 대체해야합니다.
편집 오늘의 새로운 시작을 내놓으시기 바랍니다. 나는 그것이 단순하다는 것을 알았다.
void MakePointToSameValue(Test& other)
{
other.ptr.swap(ptr);
ptr.reset();
ptr = other.ptr;
}
추가 질문은 다음과 같습니다. 표준 준수 포인터에 대해 예상대로 작동합니까?
정확히 무엇입니까? –
두 단계의 간접 참조가 필요합니다. –
@CatPlusPlus 마지막 단락을 참조하십시오. – stijn