基于范围的for循环中解引用vector指针的正确方法
嗨,这个问题很典型——你遇到的是C++中自定义类对象输出时的常见问题。让我一步步给你讲清楚:
首先,你直接输出指针i时显示地址,这是因为std::ostream对指针类型的默认行为就是打印它的内存地址,这个是正常的。而你尝试*i时报错,本质原因是编译器不知道怎么把你的House对象转换成可输出的格式——因为std::cout的<<运算符并没有为你的自定义House类提供重载版本。
解决这个问题的核心是给House类重载std::ostream::operator<<,或者提供一个自定义的打印方法。下面是两种常用的方案:
方案一:重载operator<<(推荐)
这是C++中让自定义类支持cout输出的标准方式。你需要在House类的定义中声明友元(如果要访问私有成员的话),然后实现这个全局运算符函数:
#include <iostream> #include <string> #include <map> // 提前声明House类,方便运算符函数的声明 class House; // 声明运算符函数 std::ostream& operator<<(std::ostream& os, const House& house); class House { private: // 假设你的House类有这些私有成员,根据实际情况调整 int houseId; std::string assignedCandy; public: // 你的构造函数 House(const std::string& line, std::map<int, std::string>& candyMap) { // 这里是你的构造逻辑,比如解析line初始化成员 } // 声明友元,让运算符函数可以访问私有成员 friend std::ostream& operator<<(std::ostream& os, const House& house); }; // 实现运算符函数 std::ostream& operator<<(std::ostream& os, const House& house) { // 这里根据你的需求自定义输出格式,比如: os << "ID:" << house.houseId << " Candy:" << house.assignedCandy; return os; }
这样修改后,你原来的代码里用std::cout << std::setw(11) << *i;就可以正常输出House对象的内容,而不是地址了。
方案二:添加成员打印函数
如果你不想重载运算符,也可以给House类添加一个专门的打印成员函数,比如print():
class House { private: // 你的私有成员 int houseId; std::string assignedCandy; public: // 构造函数 House(const std::string& line, std::map<int, std::string>& candyMap) { // 构造逻辑 } // 打印函数,默认输出到cout,也可以指定其他流 void print(std::ostream& os = std::cout) const { os << "House " << houseId << " has " << assignedCandy; } };
然后在main函数里这样调用:
std::cout << std::setw(11) << " "; for(auto i : houseVector) { std::cout << std::setw(11); i->print(); // 注意这里用->,因为i是指针 }
总结一下:不管哪种方案,核心都是告诉编译器如何将你的House对象转换成可输出的字符串格式。第一种方案更符合C++的风格,也更灵活,推荐使用。
内容的提问来源于stack exchange,提问作者turing042
相关产品推荐
相关产品推荐

