C++ 为什么NetBeans显示错误的自动完成?

C++ 为什么NetBeans显示错误的自动完成?,c++,netbeans,coding-style,methods,C++,Netbeans,Coding Style,Methods,昨天我在第一学期结束时参加了一次编程考试。这是非常基本的,除了我犯了一个非常非常隐晦的错误,我想问问这里更有经验的人: 我基本上有一个类库,其中包含一个向量,该向量包含Loan*元素,该元素包含一个Customer和Book类。有点像这样: class Library { vector<Loan*> loans_; }; class Loan { Customer *customer_; Book *book_; }; Customer *getBorro

昨天我在第一学期结束时参加了一次编程考试。这是非常基本的,除了我犯了一个非常非常隐晦的错误,我想问问这里更有经验的人:

我基本上有一个类库,其中包含一个向量,该向量包含Loan*元素,该元素包含一个Customer和Book类。有点像这样:

class Library
{
    vector<Loan*> loans_;
};

class Loan
{
    Customer *customer_;
    Book *book_;
};
Customer *getBorrower(Book *book)
{
    vector<Loan*>::iterator iter;

    for( iter = loans_.begin(); iter != loans_.end(); ++iter )
    {
        if( (*iter).getBook() == book )
            return (*iter).getCustomer();
        else
            continue;
    }
    return 0;
}
类库
{
媒介贷款;
};
集体贷款
{
客户*客户*;
书*书*;
};
我有一个函数,需要遍历所有初始化的book对象并查看哪些对象属于谁,如下所示:

class Library
{
    vector<Loan*> loans_;
};

class Loan
{
    Customer *customer_;
    Book *book_;
};
Customer *getBorrower(Book *book)
{
    vector<Loan*>::iterator iter;

    for( iter = loans_.begin(); iter != loans_.end(); ++iter )
    {
        if( (*iter).getBook() == book )
            return (*iter).getCustomer();
        else
            continue;
    }
    return 0;
}
Customer*get借款人(Book*Book)
{
向量:迭代器iter;
for(iter=loans_u.begin();iter!=loans_u.end();++iter)
{
if((*iter.getBook()==book)
return(*iter.getCustomer();
其他的
持续
}
返回0;
}
这让我很困惑,因为在Netbeans 6.9 IDE中(*iter)。向我显示了贷款对象的所有方法的列表

我正要退出考试,这时我加载了VC++08,它问我是否不想使用
->

(*iter)->getBook()让我懊恼不已

所以我的问题是:为什么IDE允许我使用
,甚至为
->
列出一系列方法?据我所知,它在其他任何时候都不会做出这种疯狂的行为。这里到底发生了什么?我不明白我试图让这个方法做什么,它给了我一个奇怪的netbeans错误“不是Loan*类型”

第二个问题:这是一个风格问题。我就此向教授发表了评论,但他似乎不太和蔼可亲。考试指南也让我们创建了一个公共

向量
向量

然后,我们从主函数访问这些函数来运行单元测试。我发现这是一种非常糟糕的做法,因为一个简单的getter函数可以在不公开信息的情况下为我们提供所需的信息。我说这是一个糟糕的设计选择,对吗

错误:

Library.cpp:14:错误:请求成员
getCustomer',在
(&iter)->\uu gnu\u cxx:::\uuuu normal\u迭代器::operator*中使用u iterator=Loan**,\u Container=std::vector>',这是非类类型“Loan*”

表达式
(*iter)->getBook()
。类型
vector::iterator
是指
T
的一个实例,通常是一个普通的老式
T*
。在您的例子中,
T
Loan*
,因此
T*
Loan**
。因此,
iter
是一个
Loan**
,因此,
(*iter)
是一个
Loan*
,您可以使用
->
操作符访问它

很可能NetBeans和您一样困惑,尽管它没有那么多借口。:-)

表达式
(*iter)->getBook()
应该可以工作。类型
vector::iterator
是指
T
的一个实例,通常是一个普通的老式
T*
。在您的例子中,
T
Loan*
,因此
T*
Loan**
。因此,
iter
是一个
Loan**
,因此,
(*iter)
是一个
Loan*
,您可以使用
->
操作符访问它

很可能NetBeans和您一样困惑,尽管它没有那么多借口。:-)

在C中,
(*foo).bar
将跟随指向foo结构的
foo
指针,并找到
bar
成员。因为这是一个冗长的输入量,所以引入了
foo->bar
来跟随指向foo结构的
foo
指针并查找
bar
成员

因此,您必须根据是使用指向结构的指针还是使用结构来选择使用
还是
->

请注意,我不知道C++是如何使用代码来扩展< <代码> > >代码>和<代码> ./Cuff>,但是由于第一个C++实现是基于C结构的,我假设
->
以相同的方式处理类:类型为
class
的对象用
取消引用,类型为
指向类的指针的对象用
->
取消引用。但这是我的猜测。

在C中,
(*foo).bar
将跟随指向foo结构的
foo
指针并找到
bar
成员。因为这是一个冗长的输入量,所以引入了
foo->bar
来跟随指向foo结构的
foo
指针并查找
bar
成员

因此,您必须根据是使用指向结构的指针还是使用结构来选择使用
还是
->


请注意,我不知道C++是如何使用代码来扩展< <代码> > >代码>和<代码> ./Cuff>,但是由于第一个C++实现是基于C结构的,我假设
->
以相同的方式处理类:类型为
class
的对象用
取消引用,类型为
指向类的指针的对象用
->
取消引用。但这只是我的猜测。

好吧,看来Intellisense只是比NetBeans好而已

(*iter)->getBook()
在本例中是获得该方法的正确方法。请注意,迭代器是一种指针,其重载运算符
*
->
的行为类似于普通指针

在您的例子中,
*iter
是向量中元素的解引用,即指针。因此,如果您想访问该方法,必须使用运算符
->
,这样构造
(*iter)->getBook()
就有效了。还有更模糊的方法:
(*(*iter)).getBook()

嗯,看起来