2012-02-04 70 views
3

我有一个Deck类的对象,其中包含一个指向另一个类的对象的指针的动态分配数组,游戏卡。我试图超载< <运算符(作为Deck类的朋友),以迭代方式输出Deck对象中每张牌的细节。目前超负荷的定义是这样的:C++ - 取消引用是数组元素的指针?

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; 
} 

当试图构建一个甲板对象,并输出其信用卡细节,它输出的内存地址,而不是实际的数据列表,所以我想我需要取消引用pCards [一世]。但是,当我尝试这样做时,输出是垃圾,最终在调试器中遇到访问冲突。我已经尝试了所有的以下连击的,但所有导致无论是在编译时或运行时的问题:

*pCards[i], pCards[i]*, (*pCards[i]), *(pCards[i]) 

是解引用指针数组内的是这只是不正确的语法,还是有更深层次的东西我在这里不理解?我该如何重写这段代码,以便程序输出由这些PlayingCard对象保存的实际数据,而不仅仅是内存地址?

+0

问题可能是在getPlayingCards ... – 2012-02-04 20:52:46

+0

你有没有使用迭代容器比如std :: vector的或std ::设置,而不是考虑。至少你可以通过这种方式获得集合的开始迭代器的getter,并且只需迭代 - 至少这样你就不用担心指针了(当然,这对于可用性有一定的假设更好的是,您还可以使用Visitor设计模式遍历PlayingCard对象的集合,在Deck对象中保留遍历逻辑... – hatboyzero 2012-02-04 21:01:26

回答

1

*pCards[i](*pCards[i])*(pCards[i])都取消引用的对象。在程序的另一部分还有其他问题,可能是在执行Deck

0
ostream& operator<< (ostream& out, const Deck& d) 
{ 
    PlayingCard** pCards = d.getPlayingCards(); 
    for(int i = 0; i < d.getTotalCards(); ++i) 
     out << (*(pCards[i])) << endl; 
    return out; 
} 

你传入pCards[i]这是一个指向PlayingCard(= PlayingCard *)。不会有operator<<方法超载,所以你需要*(pCards[i]),但你必须确保你有类PlayingCard相称的超载。即与签名友元函数:

ostream& operator<< (ostream& out, const PlayingCard& d); 

哎呀,刚刚看了你的评论:

 // the << operator is also overloaded in the PlayingCard class to take PlayingCard objects as arguments. 
     // the overload in the PlayingCard class definitely works. 

你确定方法是,你已经证明代码上面的功能可见?

+0

这是一个非常好的问题,并且我不确定。作为PlayCard类的朋友功能,我有ostream&operator <<(ostream&out,const PlayingCard&pc)。然后在Deck的头文件中对PlayingCard进行前向声明,最后将两个类的头文件包含在Deck的源文件中。 – 2012-02-04 21:04:37