遍历指向类的指针向量
Posted
技术标签:
【中文标题】遍历指向类的指针向量【英文标题】:Iterating through a vector of pointers to classes 【发布时间】:2014-05-26 00:05:00 【问题描述】:所以我遇到了一个问题,我试图获取船舶的坐标并返回一个指针。但是我遇到了一个问题,编译器没有检测到我为我的船类创建的私有变量。
在我的 .h 文件中。
#ifndef BOARD_H
#define BOARD_H
#include "Ship.h"
#include<vector>
class Board
private:
std::vector<Ship *> shipList;
char score[10][10];
Ship *shipAt(int x, int y);
;
#endif
我的 ship.h 文件中的相关变量
private:
int x1,y1,x2,y2;
我的功能
Ship *Board::shipAt (int x, int y)
vector <Ship*> :: iterator locate; //locating the appropiate ship with this iterator
for ( locate = shipList.begin(); locate != shipList.end() ; locate++ )
if( *locate.x1 == *locate.x2)
if(( y <= *locate.y1 && y >= *locate.y2) || (y <= *locate.y2 && y >= *locate.y1))
return locate;
else if ( *locate.y1 == *locate.y2)
if(( x <= *locate.x1 && x >= *locate.x2) || ( x <= *locate.x2 && *locate.x1))
return locate;
I'm getting the error
Board.cpp:54:15: error: ‘std::vector<Ship*>::iterator’ has no member named ‘x1’
if( *locate.x1 == *locate.x2)
^
Board.cpp:54:29: error: ‘std::vector<Ship*>::iterator’ has no member named ‘x2’
if( *locate.x1 == *locate.x2)
【问题讨论】:
那些成员是私人的,让董事会成为朋友,并使用(*locate)->
*locate.x1
真的是*(locate.x1)
,而不是(*locate).x1
。您的迭代器指向一个指针,因此您想使用(*(*locate)).x1
或重载的->
运算符使其更漂亮:(*locate)->x1
。此外,您返回的是 locate
,它是一个迭代器,而不是 Ship*
。
您的Ship
班级不应该告诉全世界它在哪里吗?为什么没有 public
函数来返回 Ship 的坐标?
保罗,我拥有所有这些功能。我刚刚获取了与手头功能相关的部分头文件。
【参考方案1】:
您遇到的第一个问题是运算符优先级。您正在尝试取消引用locate.x1
,而实际上您想要做的是首先取消引用locate
以获取指针,然后访问x1
成员。所以你想要的代码是(*locate).x1
(见下一段)
那么你还有另外两个问题。由于您有一个指针,因此要访问x1
,您需要使用->
,而不是'.
'。
最后你会遇到可见性问题,因为x1
是私有的。
错误信息给你一个很好的诊断:
错误:“std::vector
::iterator”没有名为“x2”的成员
编译器告诉您iterator
类型没有成员x2
,这应该暗示您正在尝试从错误类型的对象访问x2
。您正在尝试从 Ship
访问 x2。
【讨论】:
【参考方案2】:虽然frozenkoi的回答不错,但您可能对以下问题感兴趣。
-
不要使用指针。使用智能指针,例如http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/smart_ptr.htm
记住前增量和后增量之间的区别。始终在迭代器中使用 pre-in/decrement!
使用众所周知的算法来解决众所周知和有据可查的问题。在你的情况下Point inside rectangle test
【讨论】:
【参考方案3】:更简洁,更易于阅读:
Ship* Board::shipAt (int x, int y)
for ( auto s : shipList )
if( x < min(s->x1,s->x2) ) continue;
if( x > max(s->x1,s->x2) ) continue;
if( y < min(s->y1,s->y2) ) continue;
if( y > max(s->y1,s->y2) ) continue;
return s;
return nullptr;
【讨论】:
auto 关键字有什么作用?我从来没有见过这样的东西。 自动识别类型以上是关于遍历指向类的指针向量的主要内容,如果未能解决你的问题,请参考以下文章