我正在使用不同的类以及与这些不同类相关的对象。现在,我想编写一个单独的函数,用于将两个向量联合到另一个向量。我应该在哪里编写这些类型的单独函数。我可以使用新的头文件吗?实际上,我创建了一个新的头文件(ConnectedSegment.h)并将我的函数置于其下。但是,我收到了这个错误。
43 D:myex\ConnectedSegment.h non-member function `std::vector<int>& NeighboursToGivenValue(std::map<int, std::vector<int> >&, int, int)' cannot have `const' method qualifier
D:\myex\Detects\Makefile.win [Build Error] [Detects.o] Error 1
这是我的功能代码:
vector<int> & NeighboursToGivenValue(map<int, vector<int> > &adjacency,
int s1, int s2) const
{
vector<int>::const_iterator any;
vector<int>::iterator is_any;
vector<int> *neighbours2both = new vector<int>;
int i;
neighbours2both->reserve(adjacency[s1].size() + adjacency[s2].size());
neighbours2both->insert(neighbours2both->end(), adjacency[s1].begin(),adjacency[s1].end ());
vector<int>& neighbours2s2=adjacency[s2];
for (any=neighbours2s2.begin(); any!=neighbours2s2.end(); any++){
is_any = find (neighbours2both->begin(), neighbours2both->end(), *any);
if(is_any == neighbours2both->end()){
if(s1 != *any) neighbours2both->push_back(*any);
}
}
for (i=0; i<neighbours2both->size(); i++){
neighbours2both->erase(neighbours2both->begin() + i);
}
return(*neighbours2both);
}
在这里,我通过使用另一个名为adjacency()
的类获得了MyPoint
的值。
所以我使用myxyz.adjacency()
来设置此邻接的值。现在我不想为调用函数MyPoint
调用同一个类NeighboursToGivenValue
。所以,
你能告诉我在哪里写这个功能吗?或者,如果我在MyPoint
类中编写此函数,如何在没有该类对象的情况下调用此函数。
答案 0 :(得分:1)
这些 free 函数可以在标题中(需要在其注释中将Pedro高亮显示为inline
) - 或者它们可以在标题中声明并在实现中定义文件 - 例如,
#header
vector<int>& join_int_vector(vector<int> const& lhs, vector<int> const& rhs);
# cpp
vector<int>& join_int_vector(vector<int> const& lhs, vector<int> const& rhs)
{
// do stuff
}
你面临的问题是你只能拥有const成员函数 - 即自由函数(和静态函数)不能是const
- 它没有任何意义。
顺便说一句。不动态构造向量并返回对它的引用,即:
vector<int> *neighbours2both = new vector<int>;
:
return (*neighbours2both);
被调用者无法意识到需要手动清理此对象 - 在这种情况下,按值返回。
vector<int> join_int_vector(vector<int> const& lhs, vector<int> const& rhs)
{
vector<int> neighbours2both;
:
return neighbours2both;
}
编辑:对于标题本身定义的函数,如下所示:
inline vector<int> join_int_vector(vector<int> const& lhs, vector<int> const& rhs)
{
vector<int> neighbours2both;
:
return neighbours2both;
}
请注意使用关键字inline
- 如果此标头包含在多个翻译单元中,则可以防止出现多个定义错误。