C++从类的向量指针访问类的成员
Posted
技术标签:
【中文标题】C++从类的向量指针访问类的成员【英文标题】:C++ Access a member of a class from the pointer of a vector of the class 【发布时间】:2010-09-03 18:24:29 【问题描述】:抱歉,这真的让我很困惑,我知道答案正盯着我看,我无法弄清楚。有人可以看看吗?它用于航空公司预订系统学校项目。
这个函数接受Flight Number、容量、数量的计数 航班,以及包含所有航班作为参数的向量。 它将检查以确保航班不存在,如果存在则错误 将显示消息,否则将创建航班。计数为 航班数量也将增加。
void newFlight( string f, string s, int* n, vector<Flight> *v)
Flight temp;
//Check to see if flight number exists
bool alreadyExist = false;
for (int i=0; i < v->size(); i++)
if (f.compare((v[i].getNumber()) == 0))
alreadyExist = true;
//If it doesn't exist, create it
if (!alreadyExist)
v->push_back (temp); //Add the new Flight object to the
//vector of flights
*n++; //Increase count
else
cout << "A flight numbered " << f << " already exists";
cout << ". Flight not created.\n";
;
我的问题是,当我尝试将已在向量中的航班与我尝试添加的航班进行比较时。在第 7 行,我不断收到此消息:
错误:
‘class std::vector<Flight, std::allocator<Flight> >’
没有名为“getNumber”的成员
所讨论的向量是一个带有名为 getNumber() 的成员的 Flight 类的向量。我通过引用将向量传递给函数。所以 v 是一个指针,但我认为 [] 会处理这个问题。我也尝试使用 -> 运算符而不是点运算符,但它没有帮助。我不知所措,任何帮助将不胜感激。我比较生疏,夏天刚刚结束 :D 我也希望格式正确。
【问题讨论】:
【参考方案1】:参数 v 作为指向向量的指针传递给您的函数。如果然后使用 [] 运算符,它会认为,就像在 C 中一样,v 是一个指向向量数组的指针,所以 v[i] 实际上仍然是一个向量。
你应该这样做:
(*v)[i].getNumber();
【讨论】:
非常感谢!!!我感谢所有快速的答案。还有一件事,当我以这种方式将它与比较函数内联使用时,编译器给了我这个错误:错误:'Flight::getNumber()() == 0'中的'operator=='不匹配所以有吗无论如何要在不重载 == 运算符的情况下将其全部内联?这只是出于好奇,我只是最终将代码的输出保存到一个临时字符串变量,然后在比较函数中使用它。再次感谢! getNumber 返回的类型是什么?如果这不是本机类型(如 int),则必须定义 operator== 以告诉编译器应如何比较两种非本机类型。如果你把 operator== 的实现放在头文件中,编译器可能会为你内联(如果 operator== 的实现不是太大的话)。【参考方案2】:如果 v 是指向向量的指针,则表达式 v[n]
表示向量数组中的第 n 个向量 v。您想要的是 (*v)[n]
。
【讨论】:
【参考方案3】:我的问题是,当我尝试将已在向量中的航班与我尝试添加的航班进行比较时。在第 7 行,我不断收到此消息:
您可能应该切换到像set
或map
这样的排序容器。这将被自动处理。
【讨论】:
【参考方案4】:看起来像一个小括号问题。
尝试改变这个:
if (f.compare((v[i].getNumber()) == 0))
到
if (f.compare((v[i].getNumber())) == 0)
【讨论】:
【参考方案5】:其他一些答案已经解决了这个问题:v 是一个指针,所以你必须使用一些不同的语法来得到你想要的。
我建议如果这样的向量必须始终传递给这个函数(在其他世界,你永远不会传递 NULL),那么你应该通过引用而不是指针传递。在这种情况下,您的函数将采用vector<Flight> &v
,这将允许您使用向量而无需额外的指针语法麻烦。 v[i].getNumber()
确实有效。
【讨论】:
以上是关于C++从类的向量指针访问类的成员的主要内容,如果未能解决你的问题,请参考以下文章