(c++14) operator<< 重载不能按智能指针向量的预期工作
(c++14) operator<< overloading not working as expected from vector of smart pointers
我在这里做错了什么,但我不确定是什么。我希望程序的输出是 "tacos!",但我得到的是一个内存位置。
我正在尝试使用 C++14 功能。在这个程序中,我试图使用智能指针并重载 << 运算符。
一个 tacoCalendar 对象包含一个用于 tacoTuesdays 对象的向量智能指针,其中一个是在 tacoCalendar 的初始化时创建的。 cout << month.my_tacoTuesdays.at(0).get();
行应该将 month
中 tacoTuesdays
向量的第一个智能指针的指针发送给友元函数 friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);
,从而返回 "tacos!" 并且发送到 std::cout
.
代码:
#include <iostream>
#include <vector>
#include <string>
#include <memory>
class tacoTuesdays {
public:
tacoTuesdays(int i) {
_i = i;
}
friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);
private:
int _i;
};
std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt) {
std::string str_out = "tacos!";
os << str_out;
return os;
}
typedef std::shared_ptr< tacoTuesdays > smart_tacoTuesdays_t;
class tacoCalendar {
public:
std::vector<smart_tacoTuesdays_t> my_tacoTuesdays;
tacoCalendar(int i) {
smart_tacoTuesdays_t tt(new tacoTuesdays(i));
my_tacoTuesdays.push_back(tt);
}
~tacoCalendar() {
}
private:
};
int main(int argc, char **argv) {
using namespace std;
tacoCalendar month(2);
cout << *month.my_tacoTuesdays.at(0).get();
return 0;
}
std::shared_ptr<T>::get()
returns a T*
,但是您的 operator<<
重载(正确地)采用了引用而不是指针。
改变
cout << month.my_tacoTuesdays.at(0).get();
到
cout << *month.my_tacoTuesdays.at(0);
或者如果任何 shared_ptr
实例可以为空,
if (auto* p = month.my_tacoTuesdays.at(0).get()) {
cout << *p;
}
注意cout
的类型:
cout << month.my_tacoTuesdays.at(0).get();
正在打印 std::vector<std::shared_ptr<tacoTuesdays>>::at(0).get(0)
,这是一个指针 tacoTuesdays*
,因此 cout
为您打印原始指针地址。
要得到你想要的,你应该传递 tacoTuesdays
的 const reference
,像这样:
cout << *month.my_tacoTuesdays.at(0);
我在这里做错了什么,但我不确定是什么。我希望程序的输出是 "tacos!",但我得到的是一个内存位置。
我正在尝试使用 C++14 功能。在这个程序中,我试图使用智能指针并重载 << 运算符。
一个 tacoCalendar 对象包含一个用于 tacoTuesdays 对象的向量智能指针,其中一个是在 tacoCalendar 的初始化时创建的。 cout << month.my_tacoTuesdays.at(0).get();
行应该将 month
中 tacoTuesdays
向量的第一个智能指针的指针发送给友元函数 friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);
,从而返回 "tacos!" 并且发送到 std::cout
.
代码:
#include <iostream>
#include <vector>
#include <string>
#include <memory>
class tacoTuesdays {
public:
tacoTuesdays(int i) {
_i = i;
}
friend std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt);
private:
int _i;
};
std::ostream& operator<<(std::ostream& os, const tacoTuesdays& tt) {
std::string str_out = "tacos!";
os << str_out;
return os;
}
typedef std::shared_ptr< tacoTuesdays > smart_tacoTuesdays_t;
class tacoCalendar {
public:
std::vector<smart_tacoTuesdays_t> my_tacoTuesdays;
tacoCalendar(int i) {
smart_tacoTuesdays_t tt(new tacoTuesdays(i));
my_tacoTuesdays.push_back(tt);
}
~tacoCalendar() {
}
private:
};
int main(int argc, char **argv) {
using namespace std;
tacoCalendar month(2);
cout << *month.my_tacoTuesdays.at(0).get();
return 0;
}
std::shared_ptr<T>::get()
returns a T*
,但是您的 operator<<
重载(正确地)采用了引用而不是指针。
改变
cout << month.my_tacoTuesdays.at(0).get();
到
cout << *month.my_tacoTuesdays.at(0);
或者如果任何 shared_ptr
实例可以为空,
if (auto* p = month.my_tacoTuesdays.at(0).get()) {
cout << *p;
}
注意cout
的类型:
cout << month.my_tacoTuesdays.at(0).get();
正在打印 std::vector<std::shared_ptr<tacoTuesdays>>::at(0).get(0)
,这是一个指针 tacoTuesdays*
,因此 cout
为您打印原始指针地址。
要得到你想要的,你应该传递 tacoTuesdays
的 const reference
,像这样:
cout << *month.my_tacoTuesdays.at(0);