【发布时间】:2012-02-27 00:00:53
【问题描述】:
我有一个 Deck 类的对象,它包含一个动态分配的指针数组,指向另一个类 PlayingCard 的对象。我正在尝试重载
ostream& operator<< (ostream& out, const Deck& d)
{
PlayingCard** pCards = d.getPlayingCards();
for(int i = 0; i < d.getTotalCards(); ++i)
{
out << pCards[i] << endl;
// the << operator is also overloaded in the PlayingCard class to take PlayingCard objects as arguments.
// the overload in the PlayingCard class definitely works.
}
return out;
}
当尝试构造 Deck 对象并输出其卡片详细信息时,它会输出内存地址列表而不是实际数据,因此我想我需要取消引用 pCards[i]。但是,当我尝试这样做时,输出是垃圾,我最终在调试器中遇到访问冲突。我尝试了以下所有组合,但都导致编译时或运行时问题:
*pCards[i], pCards[i]*, (*pCards[i]), *(pCards[i])
这只是取消引用数组中指针的错误语法,还是我在这里不理解的更深层次的东西?如何重写此代码,以便程序输出这些 PlayingCard 对象所持有的实际数据,而不仅仅是内存地址?
【问题讨论】:
-
问题可能出在 getPlayingCards...
-
您是否考虑过使用像 std::vector
或 std::set 这样的可迭代容器。至少这样你就可以有一个 getter 到集合的开始迭代器并迭代——至少这样你甚至不必担心指针(当然,这对PlayingCard 的复制构造函数)...更好的是,您还可以使用 Visitor 设计模式来遍历 PlayingCard 对象的集合,将遍历逻辑保留在 Deck 对象中...
标签: c++ arrays class pointers dereference