所以我有一个问题,我试图获取一个船的坐标并返回一个指针。但是我遇到的问题是编译器没有检测到我为我的船类创建的私有变量。
在我的.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){
答案 0 :(得分:2)
您遇到的第一个问题是运营商优先级。您尝试取消引用locate.x1
实际上您想要做的是首先解除引用locate
以获取指针,然后访问x1
成员。所以你想要的代码是(*locate).x1
(见下一段)
然后你还有另外两个问题。由于您有一个指针,因此要访问x1
,您需要使用->
,而不是“.
”。
最后,您会遇到可见性问题,因为x1
是私有的。
错误消息为您提供了良好的诊断:
错误:'std :: vector&lt; Ship *&gt; :: iterator'没有名为'x2'的成员
编译器告诉您iterator
类型没有成员x2
,这应该是您尝试从错误类型的对象访问x2
的提示。您正尝试从Ship
。
答案 1 :(得分:1)
虽然freezekoi的答案很好,但您可能会对以下问题感兴趣。
答案 2 :(得分:0)
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;
}