C++ - std::shared_ptr::get

C++ - std::shared_ptr::get

public member function - 公開成員函數
Defined in header <memory> - 定義於頭文件 <memory>

1. std::shared_ptr::get

element_type* get() const noexcept;

Get pointer.
獲取指針。

Returns the stored pointer.
返回存儲的指針。

The stored pointer points to the object the shared_ptr object dereferences to, which is generally the same as its owned pointer.
存儲的指針指向 shared_ptr 對象解引用的對象,通常與其擁有的指針相同。

The stored pointer (i.e., the pointer returned by this function) may not be the owned pointer (i.e., the pointer deleted on object destruction) if the shared_ptr object is an alias (i.e., alias-constructed objects and their copies).

如果 shared_ptr 對象是別名 (i.e., alias-constructed objects and their copies),則 stored pointer (i.e., the pointer returned by this function) 可能不是 owned pointer (i.e., the pointer deleted on object destruction)。

A shared_ptr may share ownership of an object while storing a pointer to another object. get() returns the stored pointer, not the managed pointer.
shared_ptr 可以在存儲指向另一個對象的指針時共享對象的所有權。get() 返回存儲的指針,而非被管理指針。

2. Parameters

none

3. Return value

The stored pointer.
element_type is a member type, alias of shared_ptr's template parameter (T).

4. Examples

4.1 std::shared_ptr::get

//============================================================================
// Name        : std::shared_ptr::get
// Author      : Yongqiang Cheng
// Version     : Version 1.0.0
// Copyright   : Copyright (c) 2019 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <memory>

int main()
{
	int* p = new int(10);
	std::shared_ptr<int> strong(p);

	if (strong.get() == p)
		std::cout << "strong and p point to the same location\n";

	// four ways of accessing the same address:
	std::cout << *strong.get() << "\n";
	std::cout << *(strong.get()) << "\n";
	std::cout << *strong << "\n";
	std::cout << *p << "\n";

	return 0;
}
strong and p point to the same location
10
10
10
10
請按任意鍵繼續. . .
assignment [ə'saɪnmənt]:n. 任務,佈置,賦值

4.2 std::shared_ptr::get

//============================================================================
// Name        : std::shared_ptr::get
// Author      : Yongqiang Cheng
// Version     : Version 1.0.0
// Copyright   : Copyright (c) 2019 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <memory>

void output(std::string msg, int const* pint)
{
	std::cout << msg << *pint << "\n";
}

int main()
{
	int* pint = new int(10);
	std::shared_ptr<int> pshared = std::make_shared<int>(9);

	output("Naked pointer: ", pint);
	// output("Shared pointer ", pshared); // 編譯錯誤
	output("Shared pointer with get(): ", pshared.get());

	delete pint;

	return 0;
}

1>------ Build started: Project: yongqiangcheng, Configuration: Debug Win32 ------
1>  yongqiang.cpp
1>d:\visual_studio_workspace\yongqiangcheng\yongqiangcheng\yongqiang.cpp(14): error C2679: binary '<<': no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion)
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(495): note: could be 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_streambuf<char,std::char_traits<char>> *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(475): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(const void *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(455): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long double)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(435): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(double)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(415): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(float)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(395): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned __int64)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(375): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(__int64)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(355): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned long)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(335): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(315): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned int)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(290): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(int)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(270): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned short)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(236): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(short)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(216): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(bool)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(209): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(202): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_ios<char,std::char_traits<char>> &(__cdecl *)(std::basic_ios<char,std::char_traits<char>> &))'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(196): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_ostream<char,std::char_traits<char>> &(__cdecl *)(std::basic_ostream<char,std::char_traits<char>> &))'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(692): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(739): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(777): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(824): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(950): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const signed char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(957): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,signed char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(964): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const unsigned char *)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(971): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,unsigned char)'
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(981): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>,std::string>(std::basic_ostream<char,std::char_traits<char>> &&,const _Ty &)'
1>          with
1>          [
1>              _Ty=std::string
1>          ]
1>  d:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(1019): note: or       'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const std::error_code &)'
1>  d:\visual_studio_workspace\yongqiangcheng\yongqiangcheng\yongqiang.cpp(14): note: while trying to match the argument list '(std::ostream, std::string)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

添加頭文件 #include <string>

//============================================================================
// Name        : std::shared_ptr::get
// Author      : Yongqiang Cheng
// Version     : Version 1.0.0
// Copyright   : Copyright (c) 2019 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================

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

void output(std::string msg, int const* pint)
{
	std::cout << msg << *pint << "\n";
}

int main()
{
	int* pint = new int(10);
	std::shared_ptr<int> pshared = std::make_shared<int>(9);

	output("Naked pointer: ", pint);
	// output("Shared pointer ", pshared); // 編譯錯誤
	output("Shared pointer with get(): ", pshared.get());

	delete pint;

	return 0;
}

Naked pointer: 10
Shared pointer with get(): 9
請按任意鍵繼續. . .

References

http://www.cplusplus.com/reference/memory/shared_ptr/get/
https://en.cppreference.com/w/cpp/memory/shared_ptr/get

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章