C++ 为什么NetBeans显示错误的自动完成?
昨天我在第一学期结束时参加了一次编程考试。这是非常基本的,除了我犯了一个非常非常隐晦的错误,我想问问这里更有经验的人: 我基本上有一个类库,其中包含一个向量,该向量包含Loan*元素,该元素包含一个Customer和Book类。有点像这样: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
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()
嗯,看起来