遍历指向类的指针向量

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)-&gt; *locate.x1 真的是*(locate.x1),而不是(*locate).x1。您的迭代器指向一个指针,因此您想使用(*(*locate)).x1 或重载的-&gt; 运算符使其更漂亮:(*locate)-&gt;x1。此外,您返回的是 locate,它是一个迭代器,而不是 Ship* 您的Ship 班级不应该告诉全世界它在哪里吗?为什么没有 public 函数来返回 Ship 的坐标? 保罗,我拥有所有这些功能。我刚刚获取了与手头功能相关的部分头文件。 【参考方案1】:

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

那么你还有另外两个问题。由于您有一个指针,因此要访问x1,您需要使用-&gt;,而不是'.'。

最后你会遇到可见性问题,因为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 关键字有什么作用?我从来没有见过这样的东西。 自动识别类型

以上是关于遍历指向类的指针向量的主要内容,如果未能解决你的问题,请参考以下文章

指向类方法 QT 的指针向量

创建字符指针向量以指向字符串向量

如何有效地为现代 C++ 中指向虚拟基类的指针向量分配空间

从向量中正确删除指向类的指针

在c ++中返回指向向量元素的指针

返回指向向量中项目的指针(来自迭代器)