• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

이 수업 마지막에 lock() 이용해서 getname 하는 부분 질문입니다.

23.03.17 11:43 작성 조회수 363

2

#include <iostream>
#include <memory>
#include <string>

class Person
{
	std::string m_name;

	//std::shared_ptr<Person> m_partner;
	std::weak_ptr<Person> m_partner; // ⭐⭐⭐

public:
	Person(const std::string& name) : m_name(name)
	{
		std::cout << m_name << " created\n";
	}

	~Person()
	{
		std::cout << m_name << " destroyed\n";
	}

	friend bool partnerUp(std::shared_ptr<Person>& p1, std::shared_ptr<Person>& p2)
	{
		if (!p1 || !p2)
			return false;

		p1->m_partner = p2;
		p2->m_partner = p1;

		std::cout << p1->m_name << " is partnered with " << p2->m_name << "\n";

		return true;
	}

	const std::shared_ptr<Person> getPartner() const // ⭐⭐⭐
	{
		return m_partner.lock(); // ⭐⭐ lock 함수 실행
	}

	const std::string& getName() const
	{
		return m_name;
	}
};
int main()
{
	auto lucy = std::make_shared<Person>("Lucy");
	auto ricky = std::make_shared<Person>("Ricky");

	partnerUp(lucy, ricky);

	std::cout << lucy->getPartner()->getName() << std::endl;
	return 0;
}

수업 중 마지막 코드 입니다.

 

std::cout << lucy->getPartner()->getName() << std::endl;

이 부분을 통해 Ricky를 출력하게 되는 과정을 다음과 같이 해석했는데 제가 해석한게 맞는지 확인 부탁드립니다.

lucy->getPartner() 에서 lucy객체의 멤버 변수이자 weak_ptr인 m_partner의 lock()함수 호출

한편 m_partner를 ricky라는 객체 역시 소유하고 있음(partnerUp함수로 인해)

따라서 lock()는 ricky객체를 shared_ptr로 임시 변환해서 리턴

오로지 weak_ptr로는 소유하고 있는 객체의 멤버에 접근하는 것이 불가능했지만 lucy->getPartner() 이런 방식으로 ricky라는 객체를 리턴하였고 따라서 ricky라는 객체의 맴버함수 및 맴버변수에 접근할 수 있게 되었다.


1.저 코드 한줄에 대한 제 해석이 맞는지 확인 부탁드리고

2.혹시 lock()함수가 lucy객체의 멤버 함수지만 리턴한건 해당 객체의 멤버 변수(여기선 m_partner)를 해당 객체인 lucy객체와 공동으로 소유중인 ricky객체를 리턴했는데

그렇다면 lock함수는 자신이 속한 객체 이외에 공동으로 소유중인 또 다른 객체를 리턴한다
로 이해해도 되겠습니까?

 

답변 부탁드립니다. 감사합니다.

 

답변 1

답변을 작성해보세요.

1

Soobak님의 프로필

Soobak

2023.03.17

안녕하세요, 답변 도우미 Soobak 입니다. 😀

또 뵙네요! 반갑습니다. 😁

std::cout << lucy->getPartner()->getName() << std::endl;

질문 1. - 이 부분을 통해 Ricky를 출력하게 되는 과정을 다음과 같이 해석했는데 제가 해석한게 맞는지 확인 부탁드립니다.

  • lucy->getPartner() 에서 lucy객체의 멤버 변수이자 weak_ptr인 m_partner의 lock()함수 호출

    : 네, 맞습니다. 😀 lucy->getPartner()에서 lucy 객체의 멤버 변수인 m_partner가 참조하는 weak_ptrlock() 함수가 호출됩니다.

  • 한편 m_partner를 ricky라는 객체 역시 소유하고 있음(partnerUp함수로 인해)

    : 네, 맞습니다. 😁 partnerUp() 함수를 통해 서로 파트너 관계가 형성되었기 때문에, lucy 객체의 m_partner 멤버 변수는 ricky 객체를 가리키는 weak_ptr를 저장하고 있고, 동시에 ricky 객체의 m_partner 멤버 변수 또한 lucy를 가리키는 weak_ptr를 저장하고 있습니다. (두 변수는 상호 참조 관계를 통해 연결되어 있습니다.)

  • 따라서 lock()는 ricky객체를 shared_ptr로 임시 변환해서 리턴
    : 네, 맞습니다. lock() 함수는 해당 weak_ptr 이 가리키는 객체에 대한 shared_ptr 를 생성하여 반환합니다. 위 코드에서는 lucy->getPartner()에서 호출되는 lock() 함수가 lucy 객체의 m_partner 멤버 변수가 가리키는 ricky 객체에 대한 shared_ptr 를 임시로 생성하고 반환하는 것이겠죠!

질문2. 혹시 lock()함수가 lucy객체의 멤버 함수지만 리턴한건 해당 객체의 멤버 변수(여기선 m_partner)를 해당 객체인 lucy객체와 공동으로 소유중인 ricky객체를 리턴했는데 그렇다면 lock함수는 자신이 속한 객체 이외에 공동으로 소유중인 또 다른 객체를 리턴한다 로 이해해도 되겠습니까?

: 음, 우선 lock() 함수가 lucy 객체의 멤버 함수라는 것은 다소 애매한 표현인 것 같습니다. lucy 객체의 m_partner 변수가 std::weak_ptr<Person> 타입이므로, lock() 함수는 해당 std::weak_ptr 변수에서 호출되는 것입니다.
뒷 부분의 설명 부분은 옳게 학습하신 것 같습니다. 👍 lucy->getPartner() 에서 lock() 함수를 호출하면, lucy 객체의 m_partner 변수가 가리키는 ricky 객체에 대한 share_ptr 을 임시로 생성하고 반환합니다. (공동으로 소유하고 있는 주체는 lucyricky 객체의 m_partner 변수이며, 해당 변수가 서로 상대방을 가리키는 weak_ptr 타입으로 저장되어 있습니다.)

음, 답변이 되셨길 바라며, 혹시 제가 질문을 잘못 이해한 것이라면 편하게 추가로 댓글 부탁드리겠습니다.
매일 꼼꼼하게 학습하시는 모습이 멋있으세요 ! 👍👍👍그리고 매일 점점 발전하시는 모습이 느껴져서 인상깊네요!!
언제든지 또 편하게 질문 남겨주세요!!!! 화이팅!!!!!

seungmin38님의 프로필

seungmin38

질문자

2023.03.18

아 이해했습니다.감사합니다.

추가적으로,
위의 코드의 경우엔 같이 공유중인 객체가 본 객체 이외에 1개뿐이라
lock함수가 공유중인 객체를 1개만 호출했는데
혹시 그러면 공유하는 객체가 3개,4개 등등이 될 경우
lock함수를 쓰면 여러개의 객체에 대한 shared_ptr 생성하고 반환하나요??

Soobak님의 프로필

Soobak

2023.03.18

안녕하세요, 답변 도우미 Soobak 입니다.

편하게 댓글 남겨주셔서 감사합니다.

추가 질문 - 위의 코드의 경우엔 같이 공유중인 객체가 본 객체 이외에 1개뿐이라 lock함수가 공유중인 객체를 1개만 호출했는데 혹시 그러면 공유하는 객체가 3개,4개 등등이 될 경우 lock함수를 쓰면 여러개의 객체에 대한 shared_ptr 생성하고 반환하나요??
: 음... 아닙니다. 여러 개의 객체를 참조하기 위해서는 여러 개의 std::weak_ptr 변수를 사용해야 합니다. 즉, 질문자님께서 말씀하신 lock() 함수를 쓰면 여러 개의 객체에 대한 shared_ptr 이 생성되고 반환되는가? 는 아니라고 말씀드리는 게 적절할 것 같습니다.

주로 특정 자료구조에 여러 개의 변수들을 담아 관리하는데요, Microsoft- How To: Create and use weak_ptr instances 의 예제 코드를 보시면 보다 이해하시기 편하실 것 같습니다.

또한, 아직 스마트포인터와 '소유권' 등에 대한 개념에 혼란이 있으시다면, 예전 답변도우미께서 자세하게 답변해주신 글 을 참고해보시는 것도 추천드립니다. 👍

답변이 되셨길 바라며, 제가 질문을 잘못 이해하였거나, 추가적인 궁금증이 있으시다면 편하게 또 댓글 남겨주시면 감사하겠습니다. 화이팅! 😁

seungmin38님의 프로필

seungmin38

질문자

2023.03.18

아 이해했습니다. weak_ptr 포인터 변수에 대한 공유는 두개의 객체가 공유가능하고
3개의 객체가 하나의 weak_ptr 포인터 변수에 대한 공유는 불가능하며 그렇기에 "여러 개의 객체를 참조하기 위해서는 여러 개의 std::weak_ptr 변수를 사용해야 합니다" 라고 답변 주신거죠?

 

자세한 답변 감사합니다!!