通过指向类的指针向量迭代

时间:2014-05-26 00:05:01

标签: c++ class pointers iterator

所以我有一个问题,我试图获取一个船的坐标并返回一个指针。但是我遇到的问题是编译器没有检测到我为我的船类创建的私有变量。

在我的.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){

3 个答案:

答案 0 :(得分:2)

您遇到的第一个问题是运营商优先级。您尝试取消引用locate.x1实际上您想要做的是首先解除引用locate以获取指针,然后访问x1成员。所以你想要的代码是(*locate).x1(见下一段)

然后你还有另外两个问题。由于您有一个指针,因此要访问x1,您需要使用->,而不是“.”。

最后,您会遇到可见性问题,因为x1是私有的。

错误消息为您提供了良好的诊断:

  

错误:'std :: vector&lt; Ship *&gt; :: iterator'没有名为'x2'的成员

编译器告诉您iterator类型没有成员x2,这应该是您尝试从错误类型的对象访问x2的提示。您正尝试从Ship

访问x2

答案 1 :(得分:1)

虽然freezekoi的答案很好,但您可能会对以下问题感兴趣。

  1. 不要使用指针。使用智能指针,例如http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/smart_ptr.htm
  2. 记住增量前后的差异。始终使用迭代器预处理/减少!
  3. 使用众所周知的算法来解决众所周知且记录良好的问题。在您的情况下Point inside rectangle test

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