我这里有一段代码,我有一个填充的智能指针对象的向量,我如何使用基于范围的 for 循环打印所有对象的所有值?我不想要地址,而是值。提前谢谢你。
void printInfo(const std::vector< std::unique_ptr<Bird> >&fullData )
{
for(auto &info : fullData)
{
std::cout<< &info <<endl; //I want this to print getName() for each object, but how do I do that with range-based-for-loop? Something like this.. info->getName()
}
}
void fillFlock( std::vector< std::unique_ptr<Bird> > &cage)
{
size_t cageSize;
std::string name;
std::cout << "Bird cage size: " <<std::endl;
std::cin >> cageSize;
//set container size
cage.resize(cageSize);
for(auto &bird : cage)
{
std::cout<<"Bird Name " <<std::endl;
std::cin >> name;
bird.reset(new Bird(name));
}
}
int main()
{
std::vector< std::unique_ptr<Bird> > m_flock;
fillFlock(m_flock);
printInfo(m_flock);
}
您实际上是在创建一个指向唯一指针的新指针,然后打印该指针的地址。使用 &
创建指针,*
取消引用(获取值(。换句话说,
std::cout << *info << std::endl;
编辑:问题已更改并添加了额外的上下文
如果要在 info
上调用该函数,则调用该函数,
std::cout << info->getName() << std::endl;
info
的类型只是std::unique_ptr<Bird>&
,如果这就是抛弃你的东西。
也许您希望流式处理运营商自动发生这种情况。执行此操作的一种方法是定义一个采用Bird
类的operator<<
。您可以通过将以下声明添加到Bird
类来执行此操作,
class Bird {
friend std::ostream& operator<<(std::ostream& out, const Bird& bird);
};
然后在源文件中添加定义,
std::ostream& operator<<(std::ostream& out, const Bird& bird) {
return out << bird.getName();
}
这假设您的getName
函数是常量限定的,它确实应该是。